创建表时声明默认约束


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生成一个随机名称,并且我不喜欢它。

当我尝试声明默认值约束时,出现了问题:查看Internet上的信息以及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
我同意编辑。大卫·M的响应不包括如何通过一个独立的约束声明添加一个约束,但由于BOL没有任何例子,你可以命名默认的约束,除了通过这样大卫中号证实,我认为它是安全的假设SQL服务器(不一致)不支持此语法。
Peter Majeed

Answers:


177

内联创建列:

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

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


3
谢谢,这解决了名称问题。现在,我试图找出这种行为是“设计使然”(即不可能做到)还是有办法做到这一点。您知道,我喜欢保持代码整洁,并在列之后声明约束,从而使SQL文件更清晰,更易于理解和调试(或者至少是我认为的意思)。
Albireo

3
@Albireo-设计使然。table_constraint语法不包括DEFAULT
马丁·史密斯

2
仅当我删除字段和约束名称周围的引号时,此解决方案才对我有用。
David S.

1
对于较新版本的SQL Server,请使用[load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE()。请注意方括号而不是双引号。
致命狗2015年

3
实际上不是较新/较旧的版本- SET QUOTED_IDENTIFIER切换。我将修改答案,因为无论如何我都喜欢用方括号,所以我只是遵循了OP的问题风格。
David M
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.