2009-11-23 87 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