вставить столбец NOT NULL в существующую таблицу


122

Я пытался:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Но это сообщение об ошибке:

ALTER TABLE позволяет добавлять только столбцы, которые могут содержать нули или иметь определение DEFAULT.

Ответы:


223

Как вариант, вы можете сначала создать столбец с нулевым значением, затем обновить столбец таблицы действительными ненулевыми значениями и, наконец, ALTER column, чтобы установить ограничение NOT NULL:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

Другой вариант - указать правильное значение по умолчанию для вашего столбца:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'

UPD: обратите внимание, что ответ выше содержит то, GOчто необходимо при запуске этого кода на сервере Microsoft SQL. Если вы хотите выполнить ту же операцию в Oracle или MySQL, вам нужно использовать точку с запятой ;следующим образом:

ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;

1
Я лично предпочитаю первый способ, если у вас есть значения, которые вы можете ввести в поле вручную. Таким образом, вам не нужно беспокоиться о создании и удалении ограничения по умолчанию там, где оно вам не нужно.
Марк У. Диксон,

1
@acarlon - я думаю, что достигну. Упомянутое updateвами опасное заявление может нанести ущерб любому запросу. Это должно быть достаточно просто, чтобы увидеть, есть ли у вас дополнительный столбец в updateзаявлении здесь. Обычно вы добавляете только один или два столбца за раз. Если вы случайно добавили в свой updateоператор дополнительный столбец, который ему не нужен, в этом примере, возможно, вам вообще не следует отвечать за данные.
Mark W Dickson

2
Разработчики на ANDROID, использующие SQLite, должны знать, что ALTER COLUMNон НЕ поддерживается в SQLite.
Sdghasemi

2
Я никогда раньше не видел, GOи похоже, что он не является частью спецификации SQL , поэтому он, вероятно, приведет к сбою для скриптов, не выполняемых одним из инструментов, которые его поддерживают. Просто используйте точку с запятой? Я не рекомендую распространять стандарты Microsoft, поскольку они редко заботятся о каком-либо установленном и разумном стандарте, а изобретают свои собственные, просто чтобы изобрести свои собственные. Кроме того, полезный ответ.
Neonit

2
@Neon, спасибо за комментарий, но исходный вопрос был о сервере MS SQL, поэтому здесь есть GO. Но я добавлю об этом примечание к своему ответу.
Павел Морщенюк

13

Если вы не разрешаете столбцу быть пустым, вам необходимо указать значение по умолчанию для заполнения существующих строк. например

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0

В Enterprise Edition это изменение только метаданных с 2012 года.


2
В этом нет необходимости , но это один из вариантов.
Мэтт

6

Сообщение об ошибке довольно информативное, попробуйте:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';

а что означает "минус" в дефолтной части?
Mladen B.

3

Другие реализации SQL имеют аналогичные ограничения. Причина в том, что добавление столбца требует добавления значений для этого столбца (логически, даже если не физически), что по умолчанию NULL. Если вы не разрешаете NULLи у вас нетdefault , какова будет ценность?

Поскольку SQL Server поддерживает ADD CONSTRAINT, я бы порекомендовал Павла создать столбец, допускающий значение NULL, а затем добавить NOT NULLограничение после того, как вы заполнили его NULLзначениями, отличными от значений.


MySQL поддерживает добавление ненулевых столбцов в существующую таблицу с данными, где «разумное» пустое значение для типа данных предоставляется в существующие строки (например, 0,0 для числа с плавающей запятой, 0 для целого числа, пустая строка для строки и т. Д.).
Майкл Цанг

2

Это сработало для меня, также можно «позаимствовать» из представления дизайна, внести изменения -> щелкнуть правой кнопкой мыши -> создать сценарий изменения.

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT


0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"

1
Что этот ответ добавляет к этой теме?
barbsan
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.