2013-01-24 31 views
27

我目前有:添加命名的外鍵約束創建聲明

CREATE TABLE galleries_gallery (
    id    INT NOT NULL PRIMARY KEY IDENTITY, 
    title   NVARCHAR(50) UNIQUE NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL REFERENCES galleries_templates(id), 
    jsAltImgID  INT NOT NULL REFERENCES libraryImage(id) 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0 
); 

但隨着自動生成的名稱,這使得它很難後來刪除約束這增加了制約。我需要添加什麼來命名約束?

上面的例子是MSSQL我還需要它在PostgreSQL的

+0

這裏是[創建表](http://msdn.microsoft .com/en-us/library/ms174979.aspx)。 'rowguid uniqueidentifier ROWGUIDCOL NOT NULL CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT(newid())' – Hiten004

回答

52

在SQL Server中,您可以使用constraint關鍵字來定義內聯外鍵並同時命名它們。

以下是更新後的腳本:

CREATE TABLE galleries_gallery (
    id    INT NOT NULL PRIMARY KEY IDENTITY, 
    title   NVARCHAR(50) UNIQUE NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL 
     CONSTRAINT FK_galerry_template 
     REFERENCES galleries_templates(id), 
    jsAltImgID  INT NOT NULL 
     CONSTRAINT FK_gallery_jsAltImg 
     REFERENCES libraryImage(id) 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0 
); 

我只是做了一個試驗,顯然同樣的事情也適用於PostgreSQL的:http://www.sqlfiddle.com/#!12/2ae29

+1

在Sqlite中,它起作用。 – PaulP

26
CREATE TABLE galleries_gallery (
    id    INT NOT NULL, 
    title   NVARCHAR(50) NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL, 
    jsAltImgID  INT NOT NULL, 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0, 
    CONSTRAINT galleries_gallery_id_pk PRIMARY KEY (id), 
    CONSTRAINT galleries_gallery_title_uk UNIQUE (title), 
    CONSTRAINT galleries_gallery_tmpltid_fk FOREIGN KEY (templateID) REFERENCES galleries_templates (id), 
    CONSTRAINT galleries_gallery_jsAltImgIDfk FOREIGN KEY (isAltImgID) REFERENCES libraryImage (id) 
); 

使用約束關鍵字指定約束名。國際海事組織它更乾淨,更容易做到這一點,而不是內聯線(這是可以接受的,因爲第二個答案表明),這也允許你創建UNIQUE約束多列,以及多個FKs到同一張桌子。 CONSTRAINT關鍵字不能用於非空;對非空約束的更改需要ALTER TABLE MODIFY COLUMN ... null。約束名稱必須少於或等於30個字符。使用標準的命名約定。就個人而言,我總是使用列名前面的表名,如果約束名稱超過30個字符,後面緊跟約束類型(pk,fk,uk等),則表名稱將被刪除。

+0

雖然我可以看到你的答案很整潔,但我會在這種情況下應用w0lf的答案,因爲它符合我的要求。 – Rumpleteaser

+7

@LauraHansen只是注意到,如果您有多列約束,則在表定義末尾添加約束的語法更加靈活。 –

+1

根據@AaronBertrand的評論,這是更正確的答案。但是,重要的是要注意,至少在MSSQL中,約束名稱的最大長度是128個字符。 –