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 ALTER
sie 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.
quelle
Antworten:
Machen Sie es inline mit der Spaltenerstellung:
Ich habe eckige Klammern anstelle von Anführungszeichen verwendet, da viele Leser
QUOTED_IDENTIFIERS
standardmäßig nicht damit arbeiten .quelle
table_constraint
in der Grammatik nicht enthaltenDEFAULT
[load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE()
. Beachten Sie die eckigen Klammern anstelle von doppelten Anführungszeichen.SET QUOTED_IDENTIFIER
schaltet um. Ich werde die Antwort überarbeiten, da ich die eckigen Klammern sowieso bevorzuge. Ich war gerade dem Stil der Frage des OP gefolgt.