Pytanie Dodaj kolumnę z wartością domyślną do istniejącej tabeli w SQL Server


W jaki sposób kolumna z wartością domyślną może zostać dodana do istniejącej tabeli w SQL Server 2000 / SQL Server 2005?


2297
2017-09-18 12:30


pochodzenie


i ten również w3schools.com/sql/sql_alter.asp - Academy of Programmer


Odpowiedzi:


Składnia:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

Przykład:

ALTER TABLE SomeTable
        ADD SomeCol Bit NULL --Or NOT NULL.
 CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is autogenerated.
    DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

Uwagi:

Opcjonalna nazwa ograniczenia:
Jeśli zrezygnujesz CONSTRAINT D_SomeTable_SomeCol następnie SQL Server automatycznie wygeneruje
a Default-Contraint z zabawną nazwą, np .: DF__SomeTa__SomeC__4FB7FEF6

Opcjonalne oświadczenie o wartościach:
The WITH VALUES jest potrzebny tylko wtedy, gdy twoja kolumna jest Nullable
i chcesz użyć wartości domyślnej dla istniejących rekordów.
Jeśli twoja kolumna jest NOT NULL, to automatycznie użyje wartości domyślnej
dla wszystkich istniejących rekordów, bez względu na to, czy je określisz WITH VALUES albo nie.

Jak działają wstawki z ograniczeniem domyślnym:
Jeśli wstawisz rekord do SomeTable i robić nie Sprecyzować SomeColwartość, to będzie Domyślna 0.
Jeśli wstawisz rekord i Sprecyzować SomeColWartość jako NULL (a twoja kolumna dopuszcza wartości zerowe),
wówczas nastąpi ograniczenie domyślne nie być używane i NULL zostanie wstawiony jako wartość.

Uwagi zostały oparte na świetnych opiniach wszystkich poniżej.
Specjalne podziękowania dla:
@Yatrix, @WalterStabosz, @YahooCious i @StackMan dla swoich komentarzy.


2920
2017-09-18 12:34



Należy pamiętać, że jeśli kolumna jest pusta, wówczas wartość będzie używana dla istniejących wierszy. - Richard Collette
@TheCrocodilehunter Nullable kolumna oznacza, że ​​możesz wstawić wartość Null dla wartości kolumn. Jeśli nie jest kolumną z wartością zerową, musisz wstawić wartość tego typu danych. W przypadku istniejących rekordów zostanie w nich wstawiona wartość Null, aw nowych rekordach wartość domyślna zostanie wstawiona, o ile nie określono inaczej. Ma sens? - Yatrix
Ta odpowiedź jest nieco lepsza niż dbuggera, ponieważ wyraźnie określa ograniczenie domyślne. Domyślne ograniczenie jest nadal tworzone przy użyciu składni dbuggera, ale jego nazwa jest generowana automatycznie. Znajomość dokładnej nazwy jest przydatna przy pisaniu skryptów DROP-CREATE. - Walter Stabosz
@Vertigo Jest to TYLKO prawdziwe, jeśli kolumna jest NOT NULL. Spróbuj tego: create table blah(a int not null primary key clustered); insert blah values (1), (2); alter table blah add b int null constraint df_blah_b default (0); select * from blah;Zobaczysz 2 wartości NULL dla kolumny b. - ErikE
Posługiwać się WITH VALUES zaktualizować istniejące wiersze zerowalne. Widzieć MSDN: "Jeśli dodana kolumna dopuszcza wartości puste i WITH VALUES jest określona, ​​wartość domyślna jest przechowywana w nowej kolumnie, dodawana do istniejących wierszy. " - Yahoo Serious


ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

Włączenie DOMYŚLNA wypełnia kolumnę istniejący wiersze z wartością domyślną, więc ograniczenie NOT NULL nie jest naruszone.


869
2017-09-18 12:31



Problem z tą odpowiedzią polega na tym, że wartość domyślna jest ważna tylko dla nowych rekordów. Istniejące rekordy będą nadal miały wartość NULL. - Roee Gavirel
Przekonasz się, że tak nie jest. W przeciwnym razie ograniczenie byłoby naruszone. - dbugger
Kolumny w istniejących wierszach są wypełniane wartością domyślną. Potwierdzi to mały test empiryczny. - dbugger
Aby wyjaśnić - jeśli "NOT NULL" zostanie pominięte w poleceniu, wartość dla istniejących wierszy NIE zostanie zaktualizowana i pozostanie NULL. Jeśli w komendzie znajdzie się "NOT NULL", wartość dla istniejących wierszy zostanie zaktualizowana, aby była zgodna z wartością domyślną. - Stack Man
Dla wielu kolumn ALTER TABLE table_1 ADD col_1 int NOT NULL DEFAULT (1), col_2 int NULL - aads


Podczas dodawania kolumna nullable, WITH VALUES zapewni, że określona wartość DEFAULT zostanie zastosowana do istniejących rzędów:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES

196
2018-04-12 17:40



To kluczowa kwestia. Łatwo jest założyć kolumnę z DEFAULT ograniczenie zawsze będzie mieć wartość - to znaczy nie będzie NULL, mimo że NOT NULL nie jest określony. - Bill Brinkley
@tkocmathla uh, nie mówiłem o BIT datatype, mówiłem o tym szczególe BIT  kolumna. Spójrz na odpowiedź, kolumna jest zadeklarowana jako NOT NULL. - rsenna


ALTER TABLE <table name> 
ADD <new column name> <data type> NOT NULL
GO
ALTER TABLE <table name> 
ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>
GO

115
2017-09-18 12:39



Nie zadziała to, jeśli tabela ma już zawartość, ponieważ nowa kolumna "nie zerowalna" jest tworzona przed ograniczeniem wartości domyślnej - WDuffy
Moje +1 trafia do fragmentu po pierwszym GO która dodaje ograniczenie do istniejącej kolumny. - Barry Guvenkaya


ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'

104
2017-08-05 03:28



to polecenie null musi już nie być puste - baaroz
@baaroz, działa to z NOT NULL: ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR (200) NOT NULL DEFAULT 'SNUGGLES' - stom


Uważaj, gdy dodawana kolumna ma NOT NULL ograniczenie, ale nie ma DEFAULT ograniczenie (wartość). The ALTER TABLE Instrukcja nie powiedzie się w takim przypadku, jeśli tabela zawiera wiersze. Rozwiązaniem jest usunięcie NOT NULL ograniczenie z nowej kolumny lub zapewnić DEFAULT ograniczenie dla niego.


84
2017-09-24 16:03



każdy Przykład SQL o tym ? - Kiquenet


Najbardziej podstawowa wersja z dwoma liniami

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

78
2018-05-25 14:50





Posługiwać się:

-- Add a column with a default DateTime  
-- to capture when each record is added.

ALTER TABLE myTableName  
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())  
GO 

64
2017-12-09 17:45





Jeśli chcesz dodać wiele kolumn, możesz to zrobić na przykład:

ALTER TABLE YourTable
    ADD Column1 INT NOT NULL DEFAULT 0,
        Column2 INT NOT NULL DEFAULT 1,
        Column3 VARCHAR(50) DEFAULT 'Hello'
GO

55
2017-10-14 18:38