Как изменить тип данных столбца в базе данных SQL без потери данных


198

У меня есть база данных SQL Server, и я только что понял, что могу изменить тип одного из столбцов с intна bool.

Как я могу сделать это без потери данных, которые уже введены в эту таблицу?


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

2
Вы говорите: «Я только что понял, что могу изменить тип с одного из столбцов с int на bool». Нет логического типа данных. Хотя есть немного. Вы спрашиваете, как вы можете сделать это (как уже было сказано в 2 ответах). Или ваш вопрос "Я только что понял, что это возможно - Как SQL Server делает это?"
Мартин Смит

Ответы:


329

Вы можете легко сделать это, используя следующую команду. Любое значение 0 будет превращено в 0 (BIT = false), все остальное будет превращено в 1 (BIT = true).

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

Другой вариант - создать новый столбец типа BIT, заполнить его из старого столбца, а после завершения отбросить старый столбец и переименовать новый в старое имя. Таким образом, если во время преобразования что-то пойдет не так, вы всегда можете вернуться назад, так как у вас все еще есть все данные.


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

2
И никогда не вносите подобные изменения в графический интерфейс. Всегда делайте это через такой скрипт. Графический интерфейс будет отбрасывать и воссоздавать таблицу, и это занимает гораздо больше времени. Если стол большой и на производстве, это может иметь катастрофические последствия. Плюс ко всем изменениям таблицы должен быть скрипт, который находится в управлении исходным кодом, как и весь другой код.
HLGEM

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

Я по ошибке одобрил изменения ... нужно отклонить .. потому что нет улучшений там ... Ответ совершен.
Викаш Патхак

22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

Примечание: если есть размер столбцов, просто напишите размер.


20

Если это действительное изменение.

Вы можете изменить собственность.

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

Теперь вы можете легко изменить имя столбца без воссоздания таблицы или потери записей.


5
Ни при каких обстоятельствах вы не должны вносить изменения в таблицу с помощью графического интерфейса. Он будет полностью воссоздавать таблицу, а не использовать Alter table, и это вызовет проблему, если вы снимите галочку, и таблица будет большой. Далее у вас должны быть все изменения таблиц в скрипте в системе контроля версий.
HLGEM

Посмотрите более внимательно на эту опцию - она ​​отключает безопасность, которая не даст GUI сбросить таблицу. Вы не появляются потери данных, так как GUI воссоздаст таблицу, но на сервере будет копировать / падение. Таким образом, если в таблице много данных, это приведет к очень большой операции. Кроме того, я думаю (не положительно), что это происходит в одной транзакции, поэтому вы можете заполнить свой журнал транзакций.
JMarsch

1
Думаю, я бы хотел добавить небольшое пояснение к моему предыдущему комментарию. Если вы просто делаете это на своей машине разработки, вы, вероятно, в порядке. Но я бы не советовал использовать этот метод в производственной базе данных, особенно если он критически важный.
JMarsch

8

Как вы думаете, почему вы потеряете данные? Просто зайдите в Management Studio и измените тип данных. Если существующее значение можно преобразовать в bool (бит), это будет сделано. Другими словами, если «1» соответствует значению true, а «0» соответствует значению false в исходном поле, все будет в порядке.


1
Если у вас есть данные в таблице, это не сработает. Когда вы пытаетесь изменить тип столбца, SMS утверждает, что ему нужно сначала удалить таблицу ... что, конечно, неверно, поскольку команда ALTER TABLE ... ALTER COLUMN прекрасно работает даже для полей, отличных от NULL. Вот почему они думали, что могут потерять данные.
Тони О'Хаган

1
@ TonyO'Hagan Это не правда. Вы можете отключить предупреждение, и оно будет отлично работать с существующими данными. Смотрите также stackoverflow.com/questions/2947865/...
Philippe Leybaert

1
Ладно, круто! Не знал этого. Просто попытался проголосовать за вас (назад), но ТАК мешает мне, если вы не отредактируете свой ответ. Возможно, небольшие изменения, и я могу это сделать;).
Тони О'Хаган

1
Ни при каких обстоятельствах вы не должны вносить изменения в таблицу с помощью графического интерфейса. Он будет полностью воссоздавать таблицу, а не использовать Alter table, и это вызовет проблему, если вы уберете эту галочку и таблица будет большой. Далее у вас должны быть все изменения таблиц в скрипте в системе контроля версий.
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

Перейдите в Tool-Option-designer-Table и Database конструкторы и снимите флажок Предотвратить сохранениевведите описание изображения здесь


1
Ни при каких обстоятельствах вы не должны вносить изменения в таблицу с помощью графического интерфейса. Он будет полностью воссоздавать таблицу, а не использовать Alter table, и это вызовет проблему, если вы уберете эту галочку и таблица будет большой. Далее у вас должны быть все изменения таблиц в скрипте в системе контроля версий.
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 Server 2016, я делаю это так

* Чтобы переименовать столбец Column1 в column2

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

* Чтобы изменить тип столбца из строки в int :( Пожалуйста, убедитесь, что данные в правильном формате )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

В компактной версии автоматически принимает размер для типа данных datetime, т. Е. (8), поэтому нет необходимости устанавливать размер поля и генерировать ошибку для этой операции ...


-2

Я могу изменить тип данных поля таблицы с помощью следующего запроса: а также в базе данных Oracle,

ALTER TABLE table_name
MODIFY column_name datatype;

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

-4

Замените тип данных без потери данных

alter table tablename modify columnn  newdatatype(size);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.