Fügen Sie einer vorhandenen Tabelle in SQL Server eine Spalte mit einem Standardwert hinzu

Antworten:

3498

Syntax:

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

Beispiel:

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.

Anmerkungen:

Optionaler Einschränkungsname:
Wenn Sie CONSTRAINT D_SomeTable_SomeColihn weglassen,
    generiert SQL Server automatisch eine Standardbeschränkung mit einem lustigen Namen wie:DF__SomeTa__SomeC__4FB7FEF6

Optionale With-Values-Anweisung:
Die AnweisungWITH VALUES wird nur benötigt, wenn Ihre Spalte auf Null gesetzt werden kann
    und der Standardwert für vorhandene Datensätze verwendet werden soll.
Wenn Ihre Spalte aktiviert ist NOT NULL, wird automatisch der Standardwert
    für alle vorhandenen Datensätze verwendet, unabhängig davon, ob Sie dies angeben WITH VALUESoder nicht.

Funktionsweise von
Einfügungen mit einer Standardbeschränkung: Wenn Sie einen Datensatz in den Wert von " Einfügen" einfügen SomeTableund diesen nicht angeben SomeCol, wird er auf "Standard" gesetzt 0.
Wenn Sie einen Datensatz einfügen und Geben Sie SomeCol‚s - Wert als NULL(und Ihre Spalte ermöglicht Nullen),
    dann wird die Standard-Constraint wird nicht verwendet werden und NULLwird als Wert eingefügt werden.

Die Notizen basierten auf dem großartigen Feedback aller unten.
Besonderer Dank geht an:
    @Yatrix, @WalterStabosz, @YahooSerious und @StackMan für ihre Kommentare.

James Boother
quelle
332
Beachten Sie, dass wenn die Spalte nullwertfähig ist, null der Wert ist, der für vorhandene Zeilen verwendet wird.
Richard Collette
17
@Thecrocodilehunter Nullable-Spalte bedeutet, dass Sie Null für den Spaltenwert einfügen können. Wenn es sich nicht um eine nullfähige Spalte handelt, müssen Sie einen Wert dieses Datentyps einfügen. Für vorhandene Datensätze wird also Null in diese eingefügt, und in neue Datensätze wird Ihr Standardwert eingefügt, sofern nicht anders angegeben. Sinn ergeben?
Yatrix
41
Diese Antwort gefällt mir etwas besser als die von dbugger, da sie die Standardeinschränkung explizit benennt. Eine Standardeinschränkung wird weiterhin mit der Syntax von dbugger erstellt, außer dass der Name automatisch generiert wird. Wenn Sie DROP-CREATE-Skripte schreiben, ist es praktisch, den genauen Namen zu kennen.
Walter Stabosz
18
@Vertigo Das ist NUR wahr, wenn die Spalte ist NOT NULL. Bitte versuchen Sie Folgendes: 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;Sie sehen 2 NULL-Werte für die Spalte b.
ErikE
48
Verwenden Sie WITH VALUESdiese Option, um vorhandene nullfähige Zeilen zu aktualisieren. Siehe MSDN : "Wenn die hinzugefügte Spalte Nullwerte zulässt und WITH VALUESangegeben wird, wird der Standardwert in der neuen Spalte gespeichert und zu vorhandenen Zeilen hinzugefügt."
Yahoo Serious
1008
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

Durch die Aufnahme von DEFAULT wird die Spalte in vorhandenen Zeilen mit dem Standardwert gefüllt , sodass die NOT NULL-Einschränkung nicht verletzt wird.

dbugger
quelle
13
Das Problem bei dieser Antwort ist, dass der Standardwert nur für neue Datensätze gültig ist. Bestehende Datensätze haben weiterhin den Wert NULL.
Roee Gavirel
130
Sie werden feststellen, dass dies nicht der Fall ist. Andernfalls würde die Einschränkung verletzt.
Dbugger
35
Spalten in vorhandenen Zeilen werden mit dem Standardwert gefüllt. Ein kleiner empirischer Test wird es beweisen.
Dbugger
80
Nur zur Verdeutlichung: Wenn "NOT NULL" im Befehl weggelassen wird, wird der Wert für vorhandene Zeilen NICHT aktualisiert und bleibt NULL. Wenn der Befehl "NOT NULL" enthält, wird der Wert für vorhandene Zeilen aktualisiert, um dem Standard zu entsprechen.
Stack Man
15
Für mehrere Spalten ALTER TABLE table_1 ADD col_1 int NOT NULL DEFAULT (1), col_2 int NULL
aads
233

Wenn eine Zugabe von Nullable - Spalte , WITH VALUESwird sichergestellt , dass der spezifische Standardwert auf vorhandene Zeilen angewendet wird:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
phunk_munkie
quelle
13
Dies ist ein wichtiger Punkt. Es ist leicht anzunehmen, dass eine Spalte mit einer DEFAULTEinschränkung immer einen Wert hat - das heißt, nicht NULL, obwohl NOT NULLnicht angegeben.
Bill Brinkley
6
@tkocmathla uh, ich habe nicht über den BITDatentyp gesprochen, ich habe über diese bestimmte BIT Spalte gesprochen . Schauen Sie sich die Antwort an, die Spalte wird als deklariert 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
quelle
7
Dies funktioniert nicht, wenn die Tabelle bereits Inhalt enthält, da die neue Spalte "nicht nullbar" vor der Standardwertbeschränkung erstellt wird
WDuffy
129
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
Evan V.
quelle
13
diese add null! muss nicht null sein vor
baaroz
5
@baaroz, dies funktioniert mit NOT NULL: ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR (200) NICHT NULL STANDARD 'SNUGGLES'
Shaijut
100

Beachten Sie, dass die Spalte, die Sie hinzufügen, eine NOT NULLEinschränkung aufweist, jedoch keine DEFAULTEinschränkung (Wert). Die ALTER TABLEAnweisung schlägt in diesem Fall fehl, wenn die Tabelle Zeilen enthält. Die Lösung besteht darin, entweder die NOT NULLEinschränkung aus der neuen Spalte zu entfernen oder eine DEFAULTEinschränkung dafür bereitzustellen .

Jalbert
quelle
2
Gibt es ein SQL-Beispiel dazu?
Kiquenet
98

Die einfachste Version mit nur zwei Zeilen

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
adeel41
quelle
81

Verwenden:

-- 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
quelle
79

Wenn Sie mehrere Spalten hinzufügen möchten, können Sie dies folgendermaßen tun:

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

Verwenden:

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

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

giá vàng
quelle
54

Um einer vorhandenen Datenbanktabelle eine Spalte mit einem Standardwert hinzuzufügen, können Sie Folgendes verwenden:

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

Hier ist eine andere Möglichkeit, einer vorhandenen Datenbanktabelle eine Spalte mit einem Standardwert hinzuzufügen.

Ein viel gründlicheres SQL-Skript zum Hinzufügen einer Spalte mit einem Standardwert finden Sie unten, einschließlich der Überprüfung, ob die Spalte vorhanden ist, bevor Sie sie hinzufügen. Überprüfen Sie auch die Einschränkung und löschen Sie sie, falls vorhanden. Dieses Skript benennt auch die Einschränkung, damit wir eine nette Namenskonvention haben können (ich mag DF_), und wenn nicht, gibt SQL uns eine Einschränkung mit einem Namen, der eine zufällig generierte Nummer hat. Es ist also schön, die Einschränkung auch benennen zu können.

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

Dies sind zwei Möglichkeiten, um einer vorhandenen Datenbanktabelle eine Spalte mit einem Standardwert hinzuzufügen.

Catto
quelle
52

Sie können die Sache mit T-SQL folgendermaßen machen.

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

Sie können SQL Server Management Studio auch verwenden, indem Sie im Menü Design mit der rechten Maustaste auf Tabelle klicken und den Standardwert auf Tabelle festlegen.

Wenn Sie außerdem allen Tabellen in der Datenbank dieselbe Spalte hinzufügen möchten (falls diese nicht vorhanden ist), verwenden Sie:

 USE AdventureWorks;
 EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
gngolakia
quelle
50

In SQL Server 2008-R2 gehe ich in den Entwurfsmodus - in einer Testdatenbank - und füge meine beiden Spalten mithilfe des Designers hinzu und nehme die Einstellungen über die GUI vor. Anschließend Right-Clickgibt der berüchtigte Benutzer die Option " Änderungsskript generieren " "!

Bang up öffnet ein kleines Fenster mit dem richtig formatierten Änderungsskript, das garantiert funktioniert. Drücken Sie die einfache Taste.

Jack
quelle
48

Alternativ können Sie einen Standard hinzufügen, ohne die Einschränkung explizit benennen zu müssen:

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

Wenn beim Erstellen dieser Einschränkung ein Problem mit vorhandenen Standardeinschränkungen auftritt, können diese entfernt werden durch:

alter table [schema].[tablename] drop constraint [constraintname]
Christo
quelle
1
Zu Ihrer Information: Benennen Sie die Einschränkung explizit mit einem Standard-Benennungsschema (z. B. "DF_Table_Column"), um die Wartung zu vereinfachen. Andernfalls erfordert das Auffinden der Einschränkung mehr Arbeit.
Mike Christian
43

Dies kann auch in der SSMS-GUI erfolgen. Ich zeige unten ein Standarddatum, aber der Standardwert kann natürlich beliebig sein.

  1. Platzieren Sie Ihre Tabelle in der Entwurfsansicht (Klicken Sie mit der rechten Maustaste auf die Tabelle im Objekt-Explorer-> Entwurf).
  2. Fügen Sie der Tabelle eine Spalte hinzu (oder klicken Sie auf die Spalte, die Sie aktualisieren möchten, falls diese bereits vorhanden ist).
  3. In Spalteneigenschaften unten, geben Sie (getdate())oder abcoder 0oder was auch immer Wert , den Sie in möchten Standardwert oder Binding Feld unten , wie dargestellt:

Geben Sie hier die Bildbeschreibung ein

Tony L.
quelle
39
ALTER TABLE ADD ColumnName {Column_Type} Constraint

Der MSDN-Artikel ALTER TABLE (Transact-SQL) enthält die gesamte Syntax der Änderungstabelle.

Benjamin Autin
quelle
31

Beispiel:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
Andy
quelle
23

Beispiel:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';
Mohit Tamrakar
quelle
22

Erstellen Sie zunächst eine Tabelle mit dem Namen student:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Fügen Sie eine Spalte hinzu:

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

SELECT * 
FROM STUDENT

Die Tabelle wird erstellt und einer vorhandenen Tabelle mit einem Standardwert eine Spalte hinzugefügt.

Bild 1

Laxmi
quelle
19

Dies hat viele Antworten, aber ich habe das Bedürfnis, diese erweiterte Methode hinzuzufügen. Dies scheint viel länger zu dauern, ist jedoch äußerst nützlich, wenn Sie einer Tabelle mit Millionen von Zeilen in einer aktiven Datenbank ein NOT NULL-Feld hinzufügen.

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

Dadurch wird die Spalte als nullbares Feld hinzugefügt und mit dem Standardwert werden alle Felder auf den Standardwert aktualisiert (oder Sie können aussagekräftigere Werte zuweisen). Schließlich wird die Spalte so geändert, dass sie NICHT NULL ist.

Der Grund dafür ist, wenn Sie eine große Tabelle aktualisieren und ein neues Nicht-Null-Feld hinzufügen, das in jede einzelne Zeile geschrieben werden muss, und hiermit die gesamte Tabelle beim Hinzufügen der Spalte sperrt und dann alle Werte schreibt.

Diese Methode fügt die nullfähige Spalte hinzu, die von selbst viel schneller arbeitet, und füllt dann die Daten, bevor der Status nicht null festgelegt wird.

Ich habe festgestellt, dass das Ausführen der gesamten Sache in einer Anweisung eine unserer aktiveren Tabellen für 4-8 Minuten sperrt, und ziemlich oft habe ich den Prozess abgebrochen. Diese Methode dauert in der Regel nur wenige Sekunden und führt zu einer minimalen Verriegelung.

Wenn Sie eine Tabelle im Bereich von Milliarden von Zeilen haben, kann es sich außerdem lohnen, das Update wie folgt zu stapeln:

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

    IF @@ROWCOUNT < 1000000
        BREAK;
END
Ste Bov
quelle
18

Versuche dies

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
Jakir Hossain
quelle
18

SQL Server + Tabelle ändern + Spalte hinzufügen + Standardwert eindeutige Kennung

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))
Naveen Desosha
quelle
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
quelle
3
Ich mag die NOT EXISTSPrüfung, bevor ich versuche, die Tabelle zu ändern. Sehr gute Lösung. Einige zusätzliche Kommentare dazu, wie dies funktioniert, würden es noch nützlicher machen.
Michael Gaskill
17
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
wilder Kodierer
quelle
Vielleicht das Bild durch tatsächlichen Code ersetzen? Schwer zu kopieren und einzufügen.
David Faber
6
Dies ist kein Mehrwert gegenüber den bereits vorhandenen Antworten von vor Jahren.
nvoigt
14

Fügen Sie einer Tabelle eine neue Spalte hinzu:

ALTER TABLE [table]
ADD Column1 Datatype

Zum Beispiel,

ALTER TABLE [test]
ADD ID Int

Wenn der Benutzer es automatisch inkrementieren möchte, dann:

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
Chirag Thakar
quelle
13

Dies ist für SQL Server:

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

Beispiel:

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

Wenn Sie Einschränkungen hinzufügen möchten, gehen Sie wie folgt vor:

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Akhil Singh
quelle
7
Dies ist kein Mehrwert gegenüber den bereits vorhandenen Antworten von vor Jahren.
nvoigt
11

Dies kann durch den folgenden Code erfolgen.

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
quelle
10

Versuchen Sie es mit der folgenden Abfrage:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

Dadurch wird der Tabelle eine neue Spalte hinzugefügt.

Anshul Dubey
quelle
6
diese Antwort von einem anderen Benutzer für diese Frage gegeben
janith1024
9
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

Aus dieser Abfrage können Sie eine Spalte mit einer Datentyp-Ganzzahl mit dem Standardwert 0 hinzufügen.

Sandeep Kumar
quelle
9

Nun, ich habe jetzt einige Änderungen an meiner vorherigen Antwort. Mir ist aufgefallen, dass keine der Antworten erwähnt wurde IF NOT EXISTS. Ich werde also eine neue Lösung dafür anbieten, da ich einige Probleme beim Ändern der Tabelle hatte.

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

Hier TaskSheetist der jeweilige Tabellenname und IsBilledToClientdie neue Spalte, die Sie einfügen möchten, sowie 1der Standardwert. Das heißt, in der neuen Spalte wird der Wert der vorhandenen Zeilen angegeben, daher wird dort automatisch eine festgelegt. Sie können jedoch den gewünschten Spaltentyp wie von mir verwendet ändernBIT , sodass ich den Standardwert 1 eingebe.

Ich schlage das obige System vor, weil ich auf ein Problem gestoßen bin. Also, wo liegt das Problem? Das Problem ist, wenn die IsBilledToClientSpalte in der Tabellentabelle vorhanden ist und Sie nur den Teil des unten angegebenen Codes ausführen, wird im SQL Server-Abfrage-Generator ein Fehler angezeigt. Wenn es jedoch nicht vorhanden ist, tritt beim ersten Ausführen kein Fehler bei der Ausführung auf.

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