1. ホーム
  2. tsql

[解決済み] テーブル作成時のデフォルト制約の宣言

2022-12-18 01:11:21

質問

Microsoft SQL server 2000 で、GUI を使用する代わりにコードを記述することによって新しいテーブルを作成しています。

これは私が実際に使用しているコードで、問題なく動作します。

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

どのように解決するのですか?

カラムの作成とインラインで行う。

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

を使えないリーダーが多いので、引用符ではなく角括弧を使っています。 QUOTED_IDENTIFIERS をデフォルトで使用できないためです。