Tsql 创建表时声明默认约束

Tsql 创建表时声明默认约束,tsql,sql-server-2000,default,constraints,Tsql,Sql Server 2000,Default,Constraints,我在MicrosoftSQLServer2000中创建了一个新表,通过编写代码而不是使用GUI,我正在尝试学习如何“手动方式”完成它 这是我实际使用的代码,它运行良好: CREATE TABLE "attachments" ( "attachment_id" INT NOT NULL, "load_date" SMALLDATETIME NOT NULL, "user" VARCHAR(25) NOT NULL, "file_name" VARCHAR(50) N

我在MicrosoftSQLServer2000中创建了一个新表,通过编写代码而不是使用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())
)

内联方法工作正常,但它像往常一样为常量生成一个随机名称,独立方法抛出一个错误,在“for”附近说
语法不正确。

另外,如果我创建了表,然后
ALTER
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"
)
创建表“附件”
(
“附件id”INT不为空,
“加载日期”SMALLDATETIME不为空,
“user”VARCHAR(25)不为空,
“文件名”VARCHAR(50)不为空,
约束“pk_附件”主键(“附件id”),
约束“fk_用户”外键(“用户”)引用“用户”(“用户”),
约束“加载日期”检查(“加载日期”


我在这里完全不知所措,我想做的是不可能的,还是我做错了什么


编辑:


David M演示了如何使用内联语法添加命名的默认约束,我仍然希望了解独立语法是完全错误还是我的错。

在创建列时内联执行:

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

我使用了方括号而不是引号,因为默认情况下,许多读者不会使用
QUOTED\u标识符

谢谢,这解决了名称问题。现在,我试图弄清楚这种行为是否是“故意的”(即不可能做到),或者是否有办法做到这一点。你知道,我喜欢保持我的代码“整洁”,并在列之后声明约束,使SQL文件更清晰、更易于理解和调试(至少我是这么认为的)。@Albireo-By design<代码>表\u约束
中不包含
默认值
此解决方案仅在我删除字段和约束名称周围的引号时适用。对于较新版本的SQL Server,请使用
[load\u date]SMALLDATETIME非空约束[df\u load\u date]DEFAULT GETDATE()
。请注意方括号而不是双引号。实际上不是较新/较旧版本的东西-
SET QUOTED\u IDENTIFIER
切换。我会修改答案,因为我更喜欢方括号,我只是遵循OP问题的风格。我同意编辑。David M的回答没有涉及如何通过独立的约束声明添加约束,但由于BOL没有任何可以通过David M演示的方式命名默认约束的示例,我认为可以安全地假设SQL Server(不一致)不支持此语法。另请参阅:
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"
)
[load_date] SMALLDATETIME NOT NULL
        CONSTRAINT [df_load_date] DEFAULT GETDATE()