web-dev-qa-db-fra.com

Déclarer une contrainte par défaut lors de la création d'une table

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 "de manière manuelle".

C’est le code que j’utilise actuellement et qui fonctionne très 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, car de cette manière, je peux définir un nom pour elles. Sinon, les déclarer en ligne obligerait SQL Server à générer un nom aléatoire et je ne l'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 la façon dont Microsoft SLQ Server Management Studio les crée, j'ai compris qu'elle pouvait être créée à la fois en ligne et de manière autonome:

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()

ou

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

La méthode inline fonctionne bien, mais elle génère comme d'habitude un nom aléatoire pour le constaint, la méthode autonome génère une erreur en disant Incorrect syntax near 'FOR'..

De plus, si je crée la table puis ALTER elle, la commande fonctionne:

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


En guise 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 perdue ici, est-ce que ce que je cherche à faire est impossible ou est-ce que je fais quelque chose de mal?


Edit:

David M a montré comment ajouter une contrainte nommée par défaut à l'aide de la syntaxe inline. Je cherche encore à comprendre si la syntaxe autonome est complètement fausse ou si c'est ma faute.

97
Albireo

Faites-le en ligne avec la création de colonne:

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

J'ai utilisé des crochets plutôt que des guillemets car beaucoup de lecteurs ne travailleraient pas avec QUOTED_IDENTIFIERS sur par défaut.

171
David M