вставить столбец NOT NULL в существующую таблицу - PullRequest
103 голосов
/ 16 августа 2010

Я пробовал:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Но выдает это сообщение об ошибке:

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

Ответы [ 7 ]

192 голосов
/ 16 августа 2010

В качестве опции вы можете изначально создать столбец, который может иметь значение Null, затем обновить столбец таблицы с действительными ненулевыми значениями и, наконец, столбец ALTER, чтобы установить ограничение 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;
12 голосов
/ 16 августа 2010

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

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

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

5 голосов
/ 16 августа 2010

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

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';
3 голосов
/ 16 августа 2010

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

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

2 голосов
/ 31 октября 2014

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

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT
1 голос
/ 16 августа 2010
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;
0 голосов
/ 07 мая 2019
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"
...