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


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 .


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


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.