2009-11-23 69 views
88

我正在通过编写代码而不是使用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生成一个随机的名称,我不喜欢它。

的问题出现了,当我试图声明默认值约束:在网上寻找和微软如何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" 
) 



我完全失去了这里,是我想不可能的,或者我做错了什么?


编辑:

大卫中号展示了如何使用内联语法来添加一个名为默认约束,我仍然希望了解,如果独立的语法是完全错误的,或者是我的错。

+3

我同意编辑。 David M的回应并不包括如何通过独立约束声明添加约束,但由于BOL没有任何示例可以通过David M演示的方式命名默认约束*,所以我认为这是安全的假设SQL Server(不一致)不支持此语法。 – 2011-09-30 17:06:22

+1

另请参阅:[SQL Server]附近的语法不正确(https://stackoverflow.com/questions/42440431/) – paulsm4 2017-08-16 04:00:39

回答

152

与列创建做它内联:

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

我已经用方括号,而不是作为报价很多读者不会QUOTED_IDENTIFIERS在默认情况下工作。

+2

Ctrl-C Ctrl-V - 美妙的发明! – 2009-11-23 12:20:01

+3

谢谢,这解决了名称问题。 现在我试图弄清楚这种行为是否是“通过设计”(即不可能这样做)或者是否有办法做到这一点。 你知道,我喜欢保持我的代码“整齐”,并在列使得SQL文件更清晰并且更易于理解和调试(或者至少这是我认为的)之后声明约束。 – Albireo 2009-11-23 12:25:18

+2

@Albireo - 由设计。 [语法](http://technet.microsoft.com/en-us/library/ms174979.aspx)中的'table_constraint'不包括'DEFAULT' – 2013-10-14 15:28:11