在创建表时声明默认约束

Alb*_*reo 97 t-sql default constraints sql-server-2000

我通过编写代码而不是使用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())
)
Run Code Online (Sandbox Code Playgroud)

我已经自己指定了主键,外键和检查约束,因为这样我可以为它们定义一个名称,否则将它们声明为内联会使SQL Server生成一个随机名称,而我并不"喜欢"它.

当我尝试声明默认值约束时出现问题:查看Internet上的信息以及Microsoft SLQ Server Management Studio如何创建它,我了解它可以内联和单独创建:

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()
Run Code Online (Sandbox Code Playgroud)

要么

CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"
Run Code Online (Sandbox Code Playgroud)

内联方法工作正常,但它像往常一样为constaint生成一个随机名称,独立方法抛出错误,说Incorrect syntax near 'FOR'..

此外,如果我创建表然后ALTER它,该命令工作:

ALTER TABLE "attachments"
ADD CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"
Run Code Online (Sandbox Code Playgroud)


作为参考,这是我试图执行的完整代码:

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"
)
Run Code Online (Sandbox Code Playgroud)



我在这里完全处于亏损状态,是我想做的不可能,或者我做错了什么?


编辑:

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

Dav*_*d M 173

与列创建一起内联:

[load_date] SMALLDATETIME NOT NULL
        CONSTRAINT [df_load_date] DEFAULT GETDATE()
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,这解决了名称问题.现在我试图弄清楚这种行为是"按设计"(即不可能这样做),或者是否有办法实现.你知道,我喜欢保持我的代码"整洁"并在列之后声明约束使SQL文件更清晰,更容易理解和调试(或者至少它是我的想法). (3认同)
  • @Albireo - 按设计.在[语法]中的`table_constraint`(http://technet.microsoft.com/en-us/library/ms174979.aspx)不包括`DEFAULT` (3认同)
  • 当我删除字段和约束名称周围的引号时,此解决方案仅适用于我. (2认同)
  • 实际上并不是更新/更旧的版本 - "SET QUOTED_IDENTIFIER"切换.我会修改答案,因为我更喜欢方括号,我只是按照OP的问题的风格. (2认同)