テーブル作成時のデフォルトの制約の宣言


100

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


3
編集に同意します。David Mの応答には、スタンドアロンの制約宣言を介して制約を追加する方法は含まれていませんが、BOLには、David Mが示した方法を除いてデフォルトの制約に名前を付けることができる例がないため、SQLを想定しても安全だと思いますサーバーは(矛盾して)この構文をサポートしていません。
Peter Majeed、2011

回答:


177

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

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

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


3
これで名前の問題は解決しました。今、私はこの振る舞いが「仕様による」(つまり、それを行うことが不可能である)か、それを行う方法があるかどうかを理解しようとしています。私はコードを "整頓"したままにし、列の後に制約を宣言することで、SQLファイルがより明確になり、理解とデバッグが容易になります(または少なくとも私はそう思います)。
アルビレオ

3
@Albireo-仕様による。文法には含まtable_constraintいませんDEFAULT
マーティン・スミス

2
この解決策は、フィールドと制約名の周りの引用符を削除した場合にのみ機能します。
David S.

1
SQL Serverの新しいバージョンの場合はを使用します[load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE()。二重引用符の代わりに角括弧に注意してください。
deadlydog

3
実際には新しい/古いバージョンではありません- SET QUOTED_IDENTIFIERトグル。私はとにかく角括弧を好むので、私は答えを修正します、私はただOPの質問のスタイルに従いました。
デビッドM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.