Як змінити тип даних стовпців у базі даних SQL без втрати даних


198

У мене є база даних SQL Server, і я щойно зрозумів, що можу змінити тип однієї колонки з intна bool.

Як я можу це зробити, не втрачаючи даних, які вже внесені до цієї таблиці?


3
Ви спробували створити новий бітовий стовпець, скопіювавши значення зі старого стовпця в новий, видаливши старий та перейменувавши новий? Все це в угоді, звичайно, відкат від проблем.
Раду Капреску

2
Ви кажете: "Я щойно зрозумів, що я можу змінити тип з одного зі стовпців з int на bool" Булевого типу даних немає. Хоча трохи. Ви запитуєте, як ви можете це зробити (як 2 відповіді поки що висвітлювались). Або ваше питання "Я щойно зрозумів, що це можливо - як це робить SQL Server ?"
Мартін Сміт

Відповіді:


329

Ви можете легко зробити це за допомогою наступної команди. Будь-яке значення 0 перетвориться на 0 (BIT = хибне), все інше перетвориться на 1 (BIT = true).

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

Іншим варіантом буде створити новий стовпчик типу BIT, заповнити його зі старого стовпця, і як тільки ви закінчите, киньте старий стовпець і перейменуйте новий на старе ім'я. Таким чином, якщо щось під час конверсії піде не так, ви завжди можете повернутися назад, оскільки у вас є всі дані ..


10
Іншими словами: NULLзалишається NULL, 0стає , стають Falseненульові значення (1, -1, 1999, -987 ...) True.
Альваро Гонсалес

2
І ніколи не вносити подібних змін із GUI. Завжди роби це через такий сценарій. GUI скине та відтворить таблицю, і це забирає набагато більше часу. Якщо стіл великий і на виробництві, це може бути катастрофічним. Крім того, всі зміни таблиці повинні мати сценарій, який знаходиться в контролі джерела, як і всі інші коди.
HLGEM

1
Додам, переконайтеся, що у вас є поточна резервна копія бази даних, перш ніж вносити будь-які структурні зміни в таблицю з даними. І не запускайте подібних змін у виробництві протягом пікових годин використання, якщо таблиця часто використовується або велика.
HLGEM

Я помилково схвалив правки ... потрібно відхилити .. тому що там немає поліпшень ... Ans є довершеним.
Вікаш

22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

Примітка: якщо розмір стовпців є, просто також напишіть розмір.


20

Якщо це дійсна зміна.

ви можете змінити властивість.

Інструменти -> Опції -> Дизайнери -> Дизайнери таблиць і баз даних -> Зніміть прапорець -> Попередити збереження змін, які потребували відтворення таблиці.

Тепер ви можете легко змінити назву стовпця, не відтворюючи таблицю або втрачаючи записи ур.


5
Ні в якому разі не слід вносити зміни до таблиці за допомогою GUI. Він повністю відтворить таблицю, а не використовувати таблицю Alter, і це спричинить проблему, якщо ви знімете цей прапорець і таблиця буде великою. Далі ви повинні мати всі зміни в таблицях сценарію в контролі джерела.
HLGEM

Придивіться уважніше до цього варіанту - це вимкнення безпеки, яка не дозволить GUI скинути стіл. Ви не з'являються втрати даних, так як GUI відтворить таблицю, але на сервері буде копіювати / падіння. Отже, якщо в таблиці багато даних, це спричинить дуже велику операцію. Крім того, я думаю (не позитивно), що це відбувається в одній транзакції, тому ви можете заповнити свій журнал транзакцій.
JMarsch

1
Я думаю, я хотів би додати трохи уточнень до свого попереднього коментаря. Якщо ви просто робите це на своїй розробці, ви, ймовірно, добре. Але я б не радив використовувати цей метод у виробничій базі даних, особливо якщо це важлива місія.
JMarsch

8

Чому, на вашу думку, ви втратите дані? Просто перейдіть у студію управління та змініть тип даних. Якщо існуюче значення можна перетворити на bool (біт), воно зробить це. Іншими словами, якщо "1" відобразить істинне, а "0" - неправдиве у своєму початковому полі, ви будете добре.


1
Якщо у вас є дані в таблиці, це не працюватиме. Коли ви намагаєтесь змінити тип стовпця, SMS стверджує, що спочатку йому потрібно скинути таблицю ... що, звичайно, неправильно, оскільки команда ALTER TABLE ... ALTER COLUMN працює чудово навіть для полів, що не містять NULL. Ось чому вони думали, що можуть втратити дані.
Тоні О'Хаган

1
@ TonyO'Hagan Це неправда. Ви можете вимкнути попередження, і воно буде добре працювати з наявними даними. Дивіться також stackoverflow.com/questions/2947865 / ...
Philippe Leybaert

1
ОК здорово! Не знав цього. Ви просто намагалися проголосувати за вас (назад), але ТАК мені заважає, якщо ви не редагуєте свою відповідь. Можливо, незначна зміна, і я можу це зробити;).
Тоні О’Хаган

1
Ні в якому разі не слід вносити зміни до таблиці за допомогою GUI. Він повністю відтворить таблицю, а не використовувати таблицю Alter, і це спричинить проблему, якщо ви знімете цей прапорець і таблиця буде великою. Далі ви повинні мати всі зміни в таблицях сценарію в контролі джерела.
HLGEM

Ні в якому разі. Немає жодної причини використовувати графічний інтерфейс для проектування таблиці або зміни їх, а також вагомі причини не робити цього. Всі зміни повинні бути в сценаріях, щоб мати можливість поширюватися на інші сервери та оброблятись так, як код, який вони є насправді в контролі джерела.
HLGEM

5

якщо ви використовуєте T-SQL (MSSQL); ви повинні спробувати цей сценарій:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

якщо ви використовуєте MySQL; ви повинні спробувати цей сценарій:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

якщо ви використовуєте Oracle; ви повинні спробувати цей сценарій:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)

3

Перейдіть до конструкторів інструментів-опцій-дизайнерів таблиць і баз даних та зніміть прапорець Попередження збереженнявведіть тут опис зображення


1
Ні в якому разі не слід вносити зміни до таблиці за допомогою GUI. Він повністю відтворить таблицю, а не використовувати таблицю Alter, і це спричинить проблему, якщо ви знімете цей прапорець і таблиця буде великою. Далі ви повинні мати всі зміни в таблицях сценарію в контролі джерела.
HLGEM

2

Змінення типу даних стовпця з типом стовпця:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT

1

для мене, на сервері sql 2016, я це роблю так

* Перейменувати стовпець1 у стовпчик2

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* Щоб змінити тип стовпця від рядка до int :( Будьте впевнені, що дані мають правильний формат )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

У компактному виданні розмір автоматично буде набирати тип даних, тобто (8), тому не потрібно встановлювати розмір поля та генерувати помилки для цієї операції ...


-2

Я можу змінити тип даних поля таблиці за допомогою наступного запиту: а також у БД Oracle,

ALTER TABLE table_name
MODIFY column_name datatype;

Не на сервері SQl
HLGEM

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.