2009-11-23 8 views
88

Ich erstelle eine neue Tabelle in Microsoft SQL Server 2000, indem ich den Code schreibe, anstatt die GUI zu verwenden. Ich versuche zu lernen, wie man es "manuell" macht.Deklarieren einer Standardeinschränkung beim Erstellen einer Tabelle

Dies ist der Code, den ich eigentlich bin mit, und es funktioniert gut:

CREATE TABLE "attachments" 
(
    "attachment_id" INT NOT NULL, 
    "load_date" SMALLDATETIME NOT NULL, 
    "user" VARCHAR(25) NOT NULL, 
    "file_name" VARCHAR(50) NOT NULL, 
    CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"), 
    CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"), 
    CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE()) 
) 

ich den Primärschlüssel festgelegt haben, Fremdschlüssel und überprüfen Einschränkungen auf ihre eigenen, weil ich auf diese Weise für einen Namen festlegen Wenn sie andernfalls inline deklariert würden, würde SQL Server einen zufälligen Namen generieren, und ich "mag" es nicht.

Das Problem entstand, als ich die Standardwert Einschränkung zu erklären versucht: zu den Informationen im Internet sucht und wie Microsoft SLQ Server Management Studio erstellt es, verstand ich, dass es sowohl inline erstellt werden kann und auf seinem eigenen:

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE() 

oder

CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date" 

die Inline-Methode funktioniert gut, aber es erzeugt wie üblich einem zufälligen Namen für die constaint, wirft die Stand-alone-Methode einen Fehler, sagen Incorrect syntax near 'FOR'..

Auch, wenn ich erstelle die Tabelle und dann ALTER es, der Befehl funktioniert:

ALTER TABLE "attachments" 
ADD CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date" 


Als Referenz hier ist der vollständige Code, den ich auszuführen versuche:

CREATE TABLE "attachments" 
(
    "attachment_id" INT NOT NULL, 
    "load_date" SMALLDATETIME NOT NULL, 
    "user" VARCHAR(25) NOT NULL, 
    "file_name" VARCHAR(50) NOT NULL, 
    CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"), 
    CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"), 
    CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE()), 
    CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date" 
) 



Ich bin hier total versagt, was versuche ich nicht zu tun, oder mache ich etwas falsch?


Edit:

David M zeigte, wie eine benannte Standardeinschränkung mit der Inline-Syntax hinzufügen, ich bin noch auf der Suche zu verstehen, wenn der Stand-alone-Syntax völlig falsch ist, oder es ist meine Schuld.

+3

Ich stimme der Bearbeitung zu. David Ms Antwort behandelt nicht, wie man eine Beschränkung über eine eigenständige Beschränkungsdeklaration hinzufügt, aber da BOL keine Beispiele hat, wo man die Standardbeschränkung nennen kann * außer * über die Art, wie David M gezeigt hat, denke ich, dass es sicher ist Angenommen, SQL Server (inkonsistent) unterstützt diese Syntax nicht. –

+1

Siehe auch: [Falsche Syntax in der Nähe von 'für' SQL Server] (https://stackoverflow.com/questions/42440431/) – paulsm4

Antwort

152

Tun Sie es inline mit der Spalte Erstellung:

[load_date] SMALLDATETIME NOT NULL 
     CONSTRAINT [df_load_date] DEFAULT GETDATE() 

I eckigen Klammern benutzt haben, statt Anführungszeichen so viele Leser nicht standardmäßig mit QUOTED_IDENTIFIERS auf funktionieren wird.

+2

Ctrl-C Ctrl-V - wunderbare Erfindungen! –

+3

Danke, das löst das Namensproblem. Jetzt versuche ich herauszufinden, ob dieses Verhalten "von Entwurf" ist (d. H. Es ist nicht möglich) oder wenn es einen Weg gibt, es zu tun. Sie wissen, ich mag es, meinen Code "ordentlich" zu halten und die Einschränkungen nach den Spalten deklariert macht die SQL-Dateien klarer und leichter zu verstehen und zu debuggen (oder zumindest ist es, was ich denke). – Albireo

+2

@Albireo - Von Design. 'table_constraint' in [der Grammatik] (http://technet.microsoft.com/en-us/library/ms174979.aspx) enthält nicht' DEFAULT' –