wstaw kolumnę NOT NULL do istniejącej tabeli

121

Próbowałem:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Ale daje ten komunikat o błędzie:

ALTER TABLE umożliwia dodawanie tylko kolumn, które mogą zawierać wartości null lub mieć określoną definicję DEFAULT

ANP
źródło

Odpowiedzi:

222

Opcjonalnie możesz początkowo utworzyć kolumnę z możliwością zerowania, następnie zaktualizować kolumnę tabeli prawidłowymi wartościami niepustymi, a na końcu ALTER kolumnę, aby ustawić ograniczenie 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

Inną opcją jest określenie prawidłowej wartości domyślnej dla kolumny:

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

UPD: Zwróć uwagę, że powyższa odpowiedź zawiera, GOco jest konieczne, gdy uruchamiasz ten kod na serwerze Microsoft SQL. Jeśli chcesz wykonać tę samą operację na Oracle lub MySQL, musisz użyć średnika w ;ten sposób:

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;
Pavel Morshenyuk
źródło
1
Osobiście wolę tutaj pierwszy sposób, jeśli masz wartości, które możesz wpisać w polu ręcznie. W ten sposób nie musisz martwić się tworzeniem i usuwaniem domyślnego ograniczenia tam, gdzie go nie potrzebujesz.
Mark W Dickson
1
@acarlon - myślę, że to osiąga. Niebezpieczne updatestwierdzenie, o którym wspomniałeś, byłoby szkodliwe w każdym zapytaniu. Powinno być wystarczająco proste, aby sprawdzić, czy w updatewyciągu znajduje się dodatkowa kolumna . Zwykle dodajesz tylko jedną lub dwie kolumny naraz. Jeśli zdarzy ci się dodać do updatewyciągu dodatkową kolumnę, która w tym przypadku nie należy, to może nie powinieneś przede wszystkim odpowiadać za dane.
Mark W Dickson,
1
ANDROID Deweloperzy używający SQLite powinni pamiętać, że ALTER COLUMNNIE jest on obsługiwany w SQLite.
Sdghasemi
2
Nigdy wcześniej nie widziałem GOi wydaje się, że nie jest to część specyfikacji SQL , dlatego prawdopodobnie doprowadzi to do awarii skryptów, które nie zostaną wykonane przez jedno z narzędzi, które ją obsługują. Po prostu użyj średników? Nie polecam rozpowszechniania standardów Microsoftu, ponieważ rzadko dbają oni o jakiś ustalony i rozsądny standard, ale wymyślają własne, aby mieć własne. Poza tym pomocna odpowiedź.
Neonit
2
@Neon dzięki za komentarz, ale pierwotne pytanie dotyczyło serwera MS SQL, dlatego jest tam GO. Ale dodam uwagę na ten temat do mojej odpowiedzi.
Pavel Morshenyuk
13

Jeśli nie pozwalasz, aby kolumna miała wartość Null, musisz podać wartość domyślną, aby zapełnić istniejące wiersze. na przykład

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

W wersji Enterprise jest to zmiana metadanych dopiero od 2012 roku

Martin Smith
źródło
2
Nie musisz , ale to jedna opcja.
Matt
6

Komunikat o błędzie jest dość opisowy, spróbuj:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';
a'r
źródło
a jakie jest znaczenie „minus” w domyślnej części?
Mladen B.
3

Inne implementacje SQL mają podobne ograniczenia. Powodem jest to, że dodanie kolumny wymaga dodania wartości dla tej kolumny (logicznie, nawet jeśli nie fizycznie), która domyślnie NULL. Jeśli nie pozwolisz NULLi nie masz default, jaka będzie wartość?

Ponieważ SQL Server obsługuje ADD CONSTRAINT, polecam podejście Pawła polegające na utworzeniu kolumny dopuszczającej wartość null, a następnie dodaniu NOT NULLograniczenia po wypełnieniu go NULLwartościami niebędącymi wartościami.

dan04
źródło
MySQL obsługuje dodawanie niezerowych kolumn do istniejącej tabeli z danymi, gdzie „rozsądna” pusta wartość dla typu danych jest dostarczana do istniejących wierszy (np. 0,0 dla liczby zmiennoprzecinkowej, 0 dla liczby całkowitej, pusty łańcuch dla ciągu znaków itp.).
Michael Tsang
2

U mnie to zadziałało, można je też „pożyczyć” z widoku projektu, wprowadzić zmiany -> prawy przycisk myszy -> wygenerować skrypt zmiany.

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT
pabbie
źródło
1
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;
ajoejoseph
źródło
0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"
AKronis1369
źródło
1
Co ta odpowiedź wnosi do tego tematu?
barbsan