Kann ich eine benannte Standardeinschränkung in einer Anweisung zum Hinzufügen einer Spalte in SQL Server erstellen?

163

In SQL Server habe ich eine neue Spalte in einer Tabelle:

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

Dies schlägt fehl, weil ich NOT NULL angegeben habe, ohne eine Standardeinschränkung anzugeben. Die Tabelle sollte keine Standardeinschränkung haben.

Um dies zu umgehen, könnte ich die Tabelle mit der Standardeinschränkung erstellen und sie dann entfernen.

Es scheint jedoch keine Möglichkeit zu geben, anzugeben, dass die Standardeinschränkung als Teil dieser Anweisung benannt werden soll. Meine einzige Möglichkeit, sie zu entfernen, besteht darin, eine gespeicherte Prozedur zu haben, die sie in den sys.default_constraints nachschlägt Tabelle.

Dies ist ein bisschen chaotisch / ausführlich für eine Operation, die wahrscheinlich viel passieren wird. Hat jemand bessere Lösungen dafür?

GlennS
quelle

Antworten:

224

Das sollte funktionieren:

ALTER TABLE t_tableName 
    ADD newColumn VARCHAR(50)
    CONSTRAINT YourContraintName DEFAULT '' NOT NULL
Joe Stefanelli
quelle
1
Funktioniert auch 2012. Gory Details: msdn.microsoft.com/en-us/library/ms187742.aspx
adam77
10
Warum nicht das NOT NULLneben dem Datentyp setzen? Es mag syntaktisch gültig sein, es nach der Einschränkung zu setzen, aber es scheint verwirrend, es dort zu platzieren.
Tullo_x86
102
ALTER TABLE t_tableName 
    ADD newColumn int NOT NULL
        CONSTRAINT DF_defaultvalue DEFAULT (1)
Mitch Wheat
quelle
22
Ich ziehe dies der akzeptierten Antwort vor, da ich die Standardeinschränkung löschen kann, ohne mir Sorgen machen zu müssen, dass die NOT NULL-Einschränkung verloren geht.
Elfter
7
@EleventhDoctor Das macht keinen Sinn. Der NOT NULL ist nicht Teil der Einschränkung und die drop-Anweisung verweist nur auf den Namen der Einschränkung
Roger Willcocks
11
@RogerWillcocks Sie haben Recht, aber beim Lesen wird klarer, dass NOT NULL von der Einschränkung getrennt ist.
Deluxxxe
10

Ich möchte einige Details hinzufügen, da die vorhandenen Antworten ziemlich dünn sind :

Der wichtigste Hinweis ist: Sie sollten niemals eine Einschränkung ohne expliziten Namen erstellen!

Das größte Problem bei unbenannten Einschränkungen : Wenn Sie dies auf verschiedenen Kundencomputern ausführen, erhalten Sie auf jedem Computer unterschiedliche / zufällige Namen .
Jedes zukünftige Upgrade-Skript wird echte Kopfschmerzen bereiten ...

Der allgemeine Rat lautet:

  • Keine Einschränkung ohne Namen!
  • Verwenden Sie eine Namenskonvention, z
    • DF_TableName_ColumnName für eine Standardeinschränkung
    • CK_TableName_ColumnName für eine Prüfbedingung
    • UQ_TableName_ColumnName für eine eindeutige Einschränkung
    • PK_TableName für eine Primärschlüsseleinschränkung

Die allgemeine Syntax lautet

TheColumn <DataType> Nullability CONSTRAINT ConstraintName <ConstraintType> <ConstraintDetails>

Versuchen Sie dies hier

Sie können jeder Spalte weitere Einschränkungen hinzufügen und zusätzliche Einschränkungen hinzufügen, genau wie Sie Spalten nach einem Komma hinzufügen:

CREATE TABLE dbo.SomeOtherTable(TheIdThere INT NOT NULL CONSTRAINT PK_SomeOtherTable PRIMARY KEY)
GO
CREATE TABLE dbo.TestTable
(
 --define the primary key
 ID INT IDENTITY NOT NULL CONSTRAINT PK_TestTable PRIMARY KEY

 --let the string be unique (results in a unique index implicitly)
,SomeUniqueString VARCHAR(100) NOT NULL CONSTRAINT UQ_TestTable_SomeUniqueString UNIQUE

 --define two constraints, one for a default value and one for a value check
,SomeNumber INT NULL CONSTRAINT DF_TestTable_SomeNumber DEFAULT (0)
                     CONSTRAINT CK_TestTable_SomeNumber_gt100 CHECK(SomeNumber>100)

 --add a foreign key constraint
,SomeFK INT NOT NULL CONSTRAINT FK_TestTable_SomeFK FOREIGN KEY REFERENCES dbo.SomeOtherTable(TheIdThere)

 --add a constraint for two columns separately
,CONSTRAINT UQ_TestTable_StringAndNumber UNIQUE(SomeFK,SomeNumber)
);
GO

- einige Daten einfügen

INSERT INTO dbo.SomeOtherTable VALUES(1);
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) VALUES('hello',111,1);
GO
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) 
VALUES('fails due to uniqueness of 111,1',111,1);
Shnugo
quelle
1

Versuchen Sie es wie unten beschrieben.

ALTER TABLE DEMO_TABLE
ADD Column1 INT CONSTRAINT Def_Column1 DEFAULT(3) NOT NULL,
    Column2 VARCHAR(10) CONSTRAINT Def_Column2 DEFAULT('New') NOT NULL;
GO
Arulmouzhi
quelle