Je crée une nouvelle table dans Microsoft SQL Server 2000 en écrivant le code au lieu d'utiliser l'interface graphique, j'essaie d'apprendre à le faire "à la manière manuelle".
C'est le code que j'utilise actuellement, et cela fonctionne bien:
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())
)
J'ai spécifié la clé primaire, la clé étrangère et les contraintes de vérification de leur propre chef parce que de cette façon je peux définir un nom pour eux, sinon les déclarer en ligne ferait de SQL Server générer un nom aléatoire, et je ne "aime" pas.
Le problème est survenu lorsque j'ai essayé de déclarer la contrainte de valeur par défaut: en regardant les informations sur Internet et comment Microsoft SLQ Server Management Studio le crée, j'ai compris qu'il pouvait être créé à la fois en ligne et seul:
"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()
ou
CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"
La méthode en ligne fonctionne bien, mais elle génère comme d'habitude un nom aléatoire pour la contrainte, la méthode autonome lève une erreur, en disant Incorrect syntax near 'FOR'.
.
De plus, si je crée la table puis que je la crée ALTER
, la commande fonctionne:
ALTER TABLE "attachments"
ADD CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"
À titre de référence, voici le code complet que j'essaie d'exécuter:
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"
)
Je suis totalement perdu ici, est-ce que ce que j'essaie de faire n'est pas possible, ou je fais quelque chose de mal?
Éditer:
David M a montré comment ajouter une contrainte nommée par défaut à l'aide de la syntaxe en ligne, je cherche toujours à comprendre si la syntaxe autonome est complètement fausse ou si c'est de ma faute.
la source
Réponses:
Faites-le en ligne avec la création de la colonne:
J'ai utilisé des crochets plutôt que des guillemets, car de nombreux lecteurs ne travailleront pas avec
QUOTED_IDENTIFIERS
par défaut.la source
table_constraint
dans la grammaire ne comprend pasDEFAULT
[load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE()
. Notez les crochets au lieu des guillemets doubles.SET QUOTED_IDENTIFIER
bascule. Je réviserai la réponse, comme je préfère de toute façon les crochets, je venais de suivre le style de la question du PO.