web-dev-qa-db-ja.com

テーブルを作成するときにデフォルトの制約を宣言する

GUIを使用する代わりにコードを記述することにより、Microsoft SQL Server 2000で新しいテーブルを作成しています。それを「手動で」行う方法を学習しようとしています。

これは実際に使用しているコードであり、正常に機能します。

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())
)

主キー、外部キー、およびチェック制約を独自に指定しました。この方法で名前を定義できます。そうしないと、インラインで宣言すると、SQL Serverがランダムな名前を生成し、「好き」になりません。

デフォルト値の制約を宣言しようとすると問題が発生しました。インターネット上の情報とMicrosoft SLQ Server Management Studioがどのようにそれを作成するかを見ると、インラインと単独で作成できることがわかりました。

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()

または

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

インラインメソッドは正常に機能しますが、通常どおり制約のランダムな名前を生成し、スタンドアロンメソッドはIncorrect syntax near 'FOR'.と言ってエラーをスローします。

また、テーブルを作成してからALTERそれを作成すると、コマンドは機能します。

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


参考として、実行しようとしている完全なコードを以下に示します。

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"
)



私はここで完全に途方に暮れています。私がしようとしていることは不可能ですか、それとも何か間違っていますか?


編集:

David Mは、インライン構文を使用して名前付きデフォルト制約を追加する方法を示しましたが、スタンドアロン構文が完全に間違っているのか、それとも私のせいなのかを理解したいと思っています。

97
Albireo

列の作成とインラインで実行します。

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

多くの読者はデフォルトでQUOTED_IDENTIFIERSを有効にしないため、引用符ではなく角括弧を使用しました。

171
David M