вставити стовпчик NOT NULL в існуючу таблицю


121

Я намагався:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Але воно дає це повідомлення про помилку:

ALTER TABLE дозволяє лише додавати стовпці, які можуть містити нулі або задані визначення DEFAULT

Відповіді:


222

Як варіант, ви можете спочатку створити стовпець, що працює з нулем, а потім оновити стовпчик таблиці з дійсними ненульовими значеннями та, нарешті, стовпець ALTER, щоб встановити НЕ 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
Я особисто вважаю за краще перший спосіб, якщо у вас є значення, які ви можете вводити в поле вручну. Таким чином, вам не потрібно турбуватися про створення та видалення обмежень за замовчуванням там, де воно вам не потрібно.
Марк W Діксон

1
@acarlon - Я думаю, що це досягає. Небезпечне updateтвердження, яке ви згадуєте, було б згубним для будь-якого запиту. Це повинно бути досить простим, щоб побачити, чи є у вас тут додатковий стовпець у updateвиписці. Як правило, ви додаєте лише стовпець або два одночасно. Якщо updateв цьому прикладі ви додасте додатковий стовпець до своєї заяви, яка, можливо, не повинна бути відповідальною за дані в першу чергу.
Марк У Діксон

1
ANDROID Розробники, що використовують SQLite, пам’ятайте, що ALTER COLUMNНЕ підтримується в SQLite.
Sdghasemi

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

2
@Neon дякую за коментар, але оригінальне питання стосувалося MS SQL-сервера, тому GO там. Але я додам ноту про це до своєї відповіді.
Павло Моршенюк

13

Якщо ви не дозволяєте стовпцю бути Null, вам потрібно вказати за замовчуванням для заповнення існуючих рядків. напр

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 '-';

і яке значення "мінус" у частині за замовчуванням?
Младен Б.

3

Інші реалізації SQL мають подібні обмеження. Причина полягає в тому, що для додавання стовпця потрібно додати значення для цього стовпця (логічно, навіть якщо не фізично), за замовчуванням NULL. Якщо ви не дозволяєте NULLі не маєте default, яке значення має бути?

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


MySQL підтримує додавання ненульових стовпців у існуючу таблицю з даними, де "розумне" порожнє значення для типу даних подається в існуючі рядки (тобто 0,0 для float, 0 для цілого числа, порожній рядок для рядка тощо).
Майкл Цанг

2

Це працювало для мене, його також можна «запозичити» з виду дизайну, внести зміни -> клацнути правою кнопкою миші -> створити сценарій зміни.

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


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