在创建表时声明默认约束

在2000年的 Microsoft SQL Server 中,我通过编写代码而不是使用 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 生成一个随机名称,而且我不“喜欢”它。

当我试图声明默认值约束时,问题出现了: 看看互联网上的信息以及微软 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 展示了如何使用内联语法添加命名的默认约束,我仍然在寻找理解,如果单独的语法是完全错误的,或者这是我的错误。

79615 次浏览

Do it inline with the column creation:

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

I have used square brackets rather than quotes as many readers won't work with QUOTED_IDENTIFIERS on by default.