Wie füge ich beim Erstellen einer Tabelle eine Standardeinschränkung hinzu? SQL Server [geschlossen]

11

Ich versuche, eine neue Tabelle mit Spalten zu erstellen, gefolgt von deren Einschränkung, wie unten gezeigt.

Create tblTest(
columns..
..
..
Gender int,
Constraint DF_tblTest_Gender Default 3 For Gender,
..
..
..
)

Ich erhalte jedoch eine Fehlermeldung in der Nähe der Standardeinschränkung als:

'Falsche Syntax in der Nähe von' für ''

Dhruv Raj
quelle
Möglicherweise möchten Sie einen Blick auf die offizielle Microsoft SQL Server-Dokumentation für die CREATE TABLE ...Anweisung werfen . Sie haben einen sehr grundlegenden Syntaxfehler.
John aka hot2use

Antworten:

20

Sie können die Einschränkung inline benennen:

CREATE TABLE tblTest(
  --
  --
  Gender int CONSTRAINT DF_tblTest_Gender DEFAULT 3,
  --
) ;

Wie die CREATE TABLEmsdn-Seite zeigt:

DEFAULT

... Um die Kompatibilität mit früheren Versionen von SQL Server zu gewährleisten, kann a ein Einschränkungsname zugewiesen werden DEFAULT.

In der gleichen Seite können wir feststellen , dass die einzigen Optionen für <table_constraint>sind PRIMARY KEY, FOREIGN KEYund CHECKEinschränkungen:

< table_constraint > ::=  
  [ CONSTRAINT constraint_name ]   
{  
   { PRIMARY KEY | UNIQUE }  
       {   
         NONCLUSTERED (column [ ASC | DESC ] [ ,... n ])  
         | NONCLUSTERED HASH (column [ ,... n ] ) 
               WITH ( BUCKET_COUNT = bucket_count )   
       }   
    | FOREIGN KEY   
        ( column [ ,...n ] )   
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]   
    | CHECK ( logical_expression )   
}

Wenn Sie also eine Standardeinschränkung hinzufügen möchten (Benennung oder nicht), können Sie dies nur inline oder mit einer ALTER TABLEAnweisung tun .

ypercubeᵀᴹ
quelle
Ich möchte meine Einschränkung benennen, was nicht möglich wäre, wenn ich es inline mache. Gibt es eine Möglichkeit, ohne die Anweisung inline oder alter table zu verwenden?
Dhruv Raj
4
@ DruvRaj - es ist möglich, wie diese Antwort zeigt
Martin Smith
8

Ihre Kommentare zu den beiden anderen Antworten besagen, dass Sie beim Erstellen einer "Inline" -Einschränkung keine Standardeinschränkung benennen können. Beide Antworten zeigen, dass Sie beim Inline-Erstellen tatsächlich einen Namen für die Einschränkung angeben können. Ich werde ein drittes Beispiel hinzufügen, das die Ergebnisse zeigt.

IF OBJECT_ID('dbo.Test') IS NOT NULL
DROP TABLE dbo.Test;
CREATE TABLE dbo.Test
(
    TestID int NOT NULL
        CONSTRAINT PK_Test --here I'm naming the primary key constraint!
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1)
    , SomeData varchar(42) NOT NULL
        CONSTRAINT DF_Test_SomeData --this is the name of the default constraint!
        DEFAULT ('Carrie Fisher')
);

INSERT INTO dbo.Test DEFAULT VALUES;

Dies zeigt, dass der Name der Standardeinschränkung lautet DF_Test_SomeData:

SELECT TableName = t.name
    , ConstraintName = dc.name
FROM sys.default_constraints dc
    INNER JOIN sys.tables t ON dc.parent_object_id = t.object_id;

Ergebnisse:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie sich den Objekt-Explorer in SSMS ansehen, wird der Name angezeigt:

Geben Sie hier die Bildbeschreibung ein

Max Vernon
quelle
2

Sie können default valueauf der Felddefinition verwenden.

Create tblTest(
columns..
..
..
Gender int CONSTRAINT constraint_name DEFAULT 3,
..
..
..
)

Oder verwenden Sie ALTER TABLE:

ALTER TABLE tblTest
ADD CONSTRAINT constraint_name 
DEFAULT 3
FOR Gender
McNets
quelle
Ich möchte meine Einschränkung benennen, was nicht möglich wäre, wenn ich es inline mache. Gibt es eine Möglichkeit, ohne die Anweisung inline oder alter table zu verwenden?
Dhruv Raj