Festlegen einer Standardeinschränkung beim Erstellen einer Tabelle

100

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.

Dies ist der Code, den ich tatsächlich verwende, und er funktioniert einwandfrei:

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 habe die Einschränkungen für Primärschlüssel, Fremdschlüssel und Prüfung selbst angegeben, da ich auf diese Weise einen Namen für sie definieren kann. Andernfalls würde SQL Server durch die Inline-Deklaration einen zufälligen Namen generieren und ich mag ihn nicht.

Das Problem trat auf, als ich versuchte, die Standardwertbeschränkung zu deklarieren: Als ich mir die Informationen im Internet und die Erstellung durch Microsoft SLQ Server Management Studio ansah, stellte ich fest, dass sie sowohl inline als auch einzeln erstellt werden können:

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()

oder

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

Die Inline-Methode funktioniert einwandfrei, generiert jedoch wie üblich einen zufälligen Namen für die Konstante. Die eigenständige Methode gibt einen Fehler aus Incorrect syntax near 'FOR'..

Wenn ich die Tabelle und dann ALTERsie erstelle , funktioniert der Befehl außerdem:

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


Als Referenz ist hier der vollständige Code, den ich ausführen möchte:

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 ratlos, ist das, was ich versuche, nicht möglich oder mache ich etwas falsch?


Bearbeiten:

David M hat gezeigt, wie eine benannte Standardeinschränkung mithilfe der Inline-Syntax hinzugefügt wird. Ich versuche immer noch zu verstehen, ob die eigenständige Syntax völlig falsch ist oder meine Schuld ist.

Albireo
quelle
3
Ich bin mit der Bearbeitung einverstanden. In der Antwort von David M wird nicht behandelt, wie eine Einschränkung über eine eigenständige Einschränkungsdeklaration hinzugefügt wird. Da BOL jedoch keine Beispiele enthält, in denen Sie die Standardbeschränkung benennen können, außer über die von David M demonstrierte Vorgehensweise, ist es meiner Meinung nach sicher, SQL anzunehmen Server (inkonsistent) unterstützt diese Syntax nicht.
Peter Majeed

Antworten:

177

Machen Sie es inline mit der Spaltenerstellung:

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

Ich habe eckige Klammern anstelle von Anführungszeichen verwendet, da viele Leser QUOTED_IDENTIFIERSstandardmäßig nicht damit arbeiten .

David M.
quelle
3
Danke, das löst das Namensproblem. Jetzt versuche ich herauszufinden, ob dieses Verhalten "beabsichtigt" ist (dh es ist nicht möglich, dies zu tun) oder ob es einen Weg gibt, dies zu tun. Wissen Sie, ich mag es, meinen Code "aufgeräumt" zu halten, und wenn die Einschränkungen nach den Spalten deklariert werden, werden die SQL-Dateien klarer und einfacher zu verstehen und zu debuggen (oder zumindest ist es das, was ich denke).
Albireo
3
@ Albireo - Mit Absicht. table_constraintin der Grammatik nicht enthaltenDEFAULT
Martin Smith
2
Diese Lösung funktioniert nur, wenn ich die Anführungszeichen um das Feld und die Einschränkungsnamen entferne.
David S.
1
Für neuere Versionen von SQL Server verwenden [load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE(). Beachten Sie die eckigen Klammern anstelle von doppelten Anführungszeichen.
tödlicher Hund
3
Eigentlich keine neuere / ältere Version - SET QUOTED_IDENTIFIERschaltet um. Ich werde die Antwort überarbeiten, da ich die eckigen Klammern sowieso bevorzuge. Ich war gerade dem Stil der Frage des OP gefolgt.
David M