创建表时声明默认约束条件

104

我正在编写代码创建一个新表格在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展示了如何使用行内语法添加命名默认约束,但我仍然想知道独立语法是否完全错误,或者这是我的错。


3
我同意修改。David M的回复没有涵盖如何通过独立的约束声明来添加约束,但由于BOL没有任何例子可以通过除了David M演示的方式来命名默认约束,因此我认为可以安全地假设SQL Server(不一致地)不支持这种语法。 - Peter Majeed
1个回答

186

在列创建时内联执行:

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

我使用了方括号而不是引号,因为许多读者默认情况下不使用QUOTED_IDENTIFIERS


3
谢谢,这解决了名称问题。现在我正在尝试弄清楚这种行为是否是“按设计”(即不可能实现)还是是否有方法可以实现它。你知道的,我喜欢保持我的代码“整洁”,将约束声明放在列后面使得SQL文件更清晰、易于理解和调试(至少我认为是这样)。 - Albireo
4
按照设计,“表约束”在语法中不包括“默认值”。参考链接为:http://technet.microsoft.com/en-us/library/ms174979.aspx。 - Martin Smith
我能否设置SSMS以这种方式生成表格脚本? - yucer
2
当我删除字段和约束名称周围的引号时,这个解决方案才对我有效。 - David S.
1
对于较新版本的SQL Server,请使用[load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE()。请注意,使用方括号而不是双引号。 - deadlydog
4
并不是新旧版本的问题——SET QUOTED_IDENTIFIER可以切换。我会修改答案,因为我更喜欢使用方括号,之前只是按照提问者的风格来回答问题。 - David M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接