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

Odpowiedzi:

3497

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: w
przypadku CONSTRAINT D_SomeTable_SomeColpominięcia
    program SQL Server automatycznie wygeneruje ograniczenie domyślne ze śmieszną nazwą, taką jak:DF__SomeTa__SomeC__4FB7FEF6

Opcjonalnie Oświadczenie wartościach: jest potrzebna, gdy kolumna jest Nullable tylko     i chcesz domyślna wartość używana do istniejących rekordów. Jeśli twoja kolumna jest , wówczas automatycznie użyje wartości domyślnej     dla wszystkich istniejących rekordów, niezależnie od tego, czy podasz tę wartość, czy nie.
WITH VALUES

NOT NULL
WITH VALUES

Jak praca Wstawki z domyślnym-constraint:
Po włożeniu do rekordu SomeTablei czy nie Określ SomeCol„s wartość, to będzie domyślnie 0.
Jeśli wstawić rekord i określ SomeCol„s wartość jako NULL(a kolumna pozwala null),
    a następnie Default-Ograniczenie będzie nie być używany i NULLzostanie wstawiony jako wartość.

Notatki oparto na świetnych opiniach wszystkich poniżej.
Specjalne podziękowania dla:
    @Yatrix, @WalterStabosz, @YahooSerious i @StackMan za komentarze.

James Boother
źródło
332
Pamiętaj, że jeśli kolumna ma wartość zerową, wówczas wartość null będzie wartością używaną dla istniejących wierszy.
Richard Collette,
17
@ Thecrocodilehunter Nullable column oznacza, że ​​możesz wstawić Null dla wartości kolumn. Jeśli nie jest to zerowa kolumna, musisz wstawić pewną wartość tego typu danych. Tak więc w przypadku istniejących rekordów wstawiony zostanie Null, aw nowych rekordach wstawiona zostanie domyślna wartość, chyba że określono inaczej. Ma sens?
Yatrix
41
Podoba mi się ta odpowiedź trochę lepiej niż dbugger, ponieważ wyraźnie określa domyślne ograniczenie. Domyślne ograniczenie jest nadal tworzone przy użyciu składni programu dbugger, z wyjątkiem tego, że jego nazwa jest generowana automatycznie. Znajomość dokładnej nazwy jest przydatna podczas pisania skryptów DROP-CREATE.
Walter Stabosz
18
@Vertigo Jest to prawdą TYLKO 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
48
Służy WITH VALUESdo aktualizowania istniejących zerowalnych wierszy. Patrz MSDN : „Jeśli dodana kolumna dopuszcza wartości zerowe i WITH VALUESjest określona, ​​wartość domyślna jest zapisywana w nowej kolumnie, dodawanej do istniejących wierszy.”
Yahoo Poważny
1008
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

Włączenie DOMYŚLNE wypełnia kolumnę w istniejących wierszach wartością domyślną, więc ograniczenie NOT NULL nie zostanie naruszone.

dbugger
źródło
13
Problem z tą odpowiedzią polega na tym, że wartość domyślna jest poprawna tylko dla nowych rekordów. Istniejące rekordy nadal będą miały wartość NULL.
Roee Gavirel
130
Przekonasz się, że tak nie jest. W przeciwnym razie ograniczenie zostanie naruszone.
dbugger,
35
Kolumny w istniejących wierszach są wypełnione wartością domyślną. Udowodni to mały test empiryczny.
dbugger,
80
Tylko dla wyjaśnienia - jeśli w poleceniu pominięto „NOT NULL”, wartość istniejących wierszy NIE zostanie zaktualizowana i pozostanie NULL. Jeśli w poleceniu znajduje się „NOT NULL”, wartość istniejących wierszy zostanie zaktualizowana, aby pasowała do wartości domyślnej.
Stack Man
15
Dla wielu kolumn ALTER TABLE table_1 DODAJ kolumna_1 int NIE NULL DOMYŚLNE (1), col_2 int NULL
aads
233

Dodając kolumnę zerowalną , WITH VALUESupewni się, że do istniejących wierszy zostanie zastosowana określona wartość DOMYŚLNA:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
phunk_munkie
źródło
13
To jest kluczowy punkt. Łatwo jest założyć, że kolumna z DEFAULTograniczeniem zawsze będzie miała wartość - to znaczy nie będzie NULL, nawet jeśli NOT NULLnie jest określona.
Bill Brinkley
6
@tkocmathla, nie mówiłem o typie BITdanych, mówiłem o tej konkretnej BIT kolumnie . Spójrz na odpowiedź, kolumna jest zadeklarowana jako NOT NULL.
rsenna
136
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
ddc0660
źródło
7
To nie zadziała, jeśli tabela ma już treść, ponieważ nowa kolumna „nie dopuszcza wartości
zerowej
129
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
Evan V.
źródło
13
ten dodatek null! musi być wcześniej null
baaroz
5
@ baaroz, działa to z NOT NULL: ALTER TABELA MYTABLE DODAJ MYNEWCOLUMN VARCHAR (200) NOT NULL DEFAULT 'SNUGGLES'
shaijut
100

Uważaj, gdy dodawana kolumna ma NOT NULLograniczenie, ale nie ma DEFAULTograniczenia (wartości). W ALTER TABLEtakim przypadku instrukcja zakończy się niepowodzeniem, jeśli tabela zawiera wiersze. Rozwiązaniem jest albo usunięcie NOT NULLograniczenia z nowej kolumny, albo zapewnienie DEFAULTdla niego ograniczenia.

Jalbert
źródło
2
jakaś próbka SQL na ten temat?
Kiquenet
98

Najbardziej podstawowa wersja z tylko dwiema liniami

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
adeel41
źródło
81

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 
JerryOL
źródło
79

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
Gabriel L.
źródło
56

Posługiwać się:

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

Odniesienie: ALTER TABLE (Transact-SQL) (MSDN)

giá vàng
źródło
54

Aby dodać kolumnę do istniejącej tabeli bazy danych z wartością domyślną, możemy użyć:

ALTER TABLE [dbo.table_name]
    ADD [Column_Name] BIT NOT NULL
Default ( 0 )

Oto inny sposób dodania kolumny do istniejącej tabeli bazy danych z wartością domyślną.

O wiele dokładniejszy skrypt SQL służący do dodawania kolumny z wartością domyślną znajduje się poniżej, w tym sprawdzenie, czy kolumna istnieje przed dodaniem jej, także sprawdzenie ograniczenia i usunięcie go, jeśli taki istnieje. Ten skrypt nazywa również ograniczenie, dzięki czemu możemy mieć przyjemną konwencję nazewnictwa (lubię DF_), a jeśli nie, SQL da nam ograniczenie o nazwie, która ma losowo wygenerowaną liczbę; więc miło jest móc nazwać ograniczenie.

-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = 'table_Emplyee'
              AND COLUMN_NAME = 'Column_EmployeeName'
           )
    BEGIN

        IF EXISTS ( SELECT 1
                    FROM sys.default_constraints
                    WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
                      AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
                  )
            BEGIN
                ------  DROP Contraint

                ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
            PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
            END
     --    -----   DROP Column   -----------------------------------------------------------------
        ALTER TABLE [dbo].table_Emplyee
            DROP COLUMN Column_EmployeeName
        PRINT 'Column Column_EmployeeName in images table was dropped'
    END

--------------------------------------------------------------------------
-- ADD  COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
                SELECT 1
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'table_Emplyee'
                  AND COLUMN_NAME = 'Column_EmployeeName'
               )
    BEGIN
    ----- ADD Column & Contraint
        ALTER TABLE dbo.table_Emplyee
            ADD Column_EmployeeName BIT   NOT NULL
            CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]  DEFAULT (0)
        PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
        PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
     END

GO

Są dwa sposoby dodania kolumny do istniejącej tabeli bazy danych z wartością domyślną.

Catto
źródło
52

Możesz to zrobić za pomocą T-SQL w następujący sposób.

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

Oprócz korzystania z SQL Server Management Studio można także kliknąć prawym przyciskiem myszy tabelę w menu Projekt, ustawiając wartość domyślną na tabelę.

Ponadto, jeśli chcesz dodać tę samą kolumnę (jeśli nie istnieje) do wszystkich tabel w bazie danych, użyj:

 USE AdventureWorks;
 EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
gngolakia
źródło
50

W SQL Server 2008-R2 przechodzę do trybu projektowania - w testowej bazie danych - i dodaję dwie kolumny za pomocą projektanta i dokonałem ustawień za pomocą GUI, a następnie niesławny Right-Clickdaje opcję „ Generuj skrypt zmian ”!

Bang up wyskakuje małe okno, jak się domyślacie, odpowiednio sformatowany skrypt zmiany gwarantowanej do pracy. Naciśnij łatwy przycisk.

Jacek
źródło
48

Możesz też dodać wartość domyślną bez konieczności jawnego nazwania ograniczenia:

ALTER TABLE [schema].[tablename] ADD  DEFAULT ((0)) FOR [columnname]

Jeśli masz problem z istniejącymi ograniczeniami domyślnymi podczas tworzenia tego ograniczenia, możesz je usunąć:

alter table [schema].[tablename] drop constraint [constraintname]
Christo
źródło
1
FYI, jawne nazewnictwo ograniczenia przy użyciu standardowego schematu nazewnictwa (np. „DF_Table_Column”), dla ułatwienia konserwacji. W przeciwnym razie zlokalizowanie ograniczenia wymaga więcej pracy.
Mike Christian,
43

Można to zrobić również w graficznym interfejsie SSMS. Poniżej pokazuję domyślną datę, ale wartość domyślna może oczywiście być dowolna.

  1. Umieść swoją tabelę w widoku projektu (kliknij prawym przyciskiem myszy tabelę w eksploratorze obiektów-> Projekt)
  2. Dodaj kolumnę do tabeli (lub kliknij kolumnę, którą chcesz zaktualizować, jeśli już istnieje)
  3. W Właściwościach kolumny poniżej wprowadź (getdate())lub abclub 0inną wartość, którą chcesz w polu Wartość domyślna lub Powiązanie, jak pokazano poniżej:

wprowadź opis zdjęcia tutaj

Tony L.
źródło
39
ALTER TABLE ADD ColumnName {Column_Type} Constraint

Artykuł MSDN ALTER TABLE (Transact-SQL) zawiera całą składnię tabeli zmian.

Benjamin Autin
źródło
31

Przykład:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
andy
źródło
23

Przykład:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';
Mohit Tamrakar
źródło
22

Najpierw utwórz tabelę z imieniem uczeń:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Dodaj do niej jedną kolumnę:

ALTER TABLE STUDENT 
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)

SELECT * 
FROM STUDENT

Tabela zostanie utworzona, a kolumna zostanie dodana do istniejącej tabeli z wartością domyślną.

Zdjęcie 1

Laxmi
źródło
19

To daje wiele odpowiedzi, ale czuję potrzebę dodania tej rozszerzonej metody. Wydaje się to znacznie dłuższe, ale jest niezwykle przydatne, jeśli dodajesz pole NOT NULL do tabeli z milionami wierszy w aktywnej bazie danych.

ALTER TABLE {schemaName}.{tableName}
    ADD {columnName} {datatype} NULL
    CONSTRAINT {constraintName} DEFAULT {DefaultValue}

UPDATE {schemaName}.{tableName}
    SET {columnName} = {DefaultValue}
    WHERE {columName} IS NULL

ALTER TABLE {schemaName}.{tableName}
    ALTER COLUMN {columnName} {datatype} NOT NULL

W ten sposób dodasz kolumnę jako pole zerowalne i przy wartości domyślnej zaktualizujesz wszystkie pola do wartości domyślnej (lub możesz przypisać bardziej znaczące wartości), a na koniec zmieni kolumnę na NIE NULL.

Powodem tego jest to, że jeśli zaktualizujesz tabelę na dużą skalę i dodasz nowe niepuste pole, musi ono zapisać w każdym wierszu, a tym samym zablokuje całą tabelę podczas dodawania kolumny, a następnie zapisywania wszystkich wartości.

Ta metoda doda kolumnę zerowalną, która sama działa o wiele szybciej, a następnie wypełni dane przed ustawieniem statusu różnego od zera.

Przekonałem się, że zrobienie wszystkiego w jednym oświadczeniu zablokuje jedną z naszych bardziej aktywnych tabel na 4-8 minut i dość często zabijałem ten proces. Ta metoda zazwyczaj zajmuje tylko kilka sekund i powoduje minimalne blokowanie.

Ponadto, jeśli masz tabelę w obszarze miliardów wierszy, warto podzielić ją na części tak:

WHILE 1=1
BEGIN
    UPDATE TOP (1000000) {schemaName}.{tableName}
        SET {columnName} = {DefaultValue}
        WHERE {columName} IS NULL

    IF @@ROWCOUNT < 1000000
        BREAK;
END
Ste Bov
źródło
18

Spróbuj tego

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
Jakir Hossain
źródło
18

SQL Server + Zmień tabelę + Dodaj kolumnę + Unikalny identyfikator wartości domyślnej

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))
Naveen Desosha
źródło
18
IF NOT EXISTS (
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
)
BEGIN
    ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null default
END
Jeevan Gharti
źródło
3
Podoba mi się NOT EXISTSczek przed próbą zmiany tabeli. Bardzo dobre rozwiązanie. Dodatkowe komentarze na temat tego, jak to działa, uczynią go jeszcze bardziej przydatnym.
Michael Gaskill,
17
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
dziki koder
źródło
Może zastąpić obraz faktycznym kodem? Trudno skopiować i wkleić jak jest.
David Faber,
6
Nie dodaje to żadnej wartości w stosunku do już istniejących odpowiedzi sprzed lat.
nvoigt
14

Dodaj nową kolumnę do tabeli:

ALTER TABLE [table]
ADD Column1 Datatype

Na przykład,

ALTER TABLE [test]
ADD ID Int

Jeśli użytkownik chce ustawić automatyczne zwiększanie, wówczas:

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
Chirag Thakar
źródło
13

To jest dla SQL Server:

ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES

Przykład:

ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES

Jeśli chcesz dodać ograniczenia, to:

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Akhil Singh
źródło
7
Nie dodaje to żadnej wartości w stosunku do już istniejących odpowiedzi sprzed lat.
nvoigt
11

Można to zrobić za pomocą poniższego kodu.

CREATE TABLE TestTable
    (FirstCol INT NOT NULL)
    GO
    ------------------------------
    -- Option 1
    ------------------------------
    -- Adding New Column
    ALTER TABLE TestTable
    ADD SecondCol INT
    GO
    -- Updating it with Default
    UPDATE TestTable
    SET SecondCol = 0
    GO
    -- Alter
    ALTER TABLE TestTable
    ALTER COLUMN SecondCol INT NOT NULL
    GO
Mohit Dagar
źródło
10

Wypróbuj poniższe zapytanie:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

Spowoduje to dodanie nowej kolumny do tabeli.

Anshul Dubey
źródło
6
ta odpowiedź została udzielona przez innego użytkownika na to pytanie
janith1024
9
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

Z tego zapytania możesz dodać kolumnę liczb całkowitych typu danych o wartości domyślnej 0.

Sandeep Kumar
źródło
9

Cóż, mam teraz modyfikację mojej poprzedniej odpowiedzi. Zauważyłem, że żadna z wymienionych odpowiedzi nie została wymieniona IF NOT EXISTS. Zamierzam więc przedstawić nowe rozwiązanie tego problemu, ponieważ miałem problemy z modyfikacją tabeli.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')
BEGIN
ALTER TABLE dbo.TaskSheet ADD
 IsBilledToClient bit NOT NULL DEFAULT ((1))
END
GO

Oto TaskSheetkonkretna nazwa tabeli i IsBilledToClientnowa kolumna, którą zamierzasz wstawić, oraz 1wartość domyślna. Oznacza to w nowej kolumnie, jaka będzie wartość istniejących wierszy, dlatego jeden zostanie tam ustawiony automatycznie. Możesz jednak dowolnie zmieniać, uwzględniając typ kolumny, tak jak jaBIT , więc ustawiłem wartość domyślną 1.

Sugeruję powyższy system, ponieważ napotkałem problem. Więc jaki jest problem? Problem polega na tym, że jeśli IsBilledToClientkolumna istnieje w tabeli, to jeśli wykonasz tylko część kodu podaną poniżej, zobaczysz błąd w kreatorze zapytań serwera SQL. Ale jeśli nie istnieje, to po raz pierwszy nie będzie błędu podczas wykonywania.

ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
gdmanandamohon
źródło