我正在编写代码创建一个新表格在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"
内联方法可以正常工作,但它会像往常一样为constaint生成一个随机名称。独立的方法会抛出一个错误,显示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展示了如何使用行内语法添加命名默认约束,但我仍然想知道独立语法是否完全错误,或者这是我的错。