在SQL的Create语句中添加命名的外键约束

58

我目前拥有:

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
);

但这会增加自动生成名称的限制,使得以后难以删除约束。我需要添加什么来命名约束?

上面的示例是SQL Server,我还需要在PostgreSQL中使用。


这是来自 MSDN 的 create tablerowguid uniqueidentifier ROWGUIDCOL NOT NULL CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (newid()) - Hiten004
2个回答

95
在 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


50
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)
);

使用 CONSTRAINT 关键字来指定约束名。在表格末尾而不是行内进行此操作更加清晰易读(两种方式都可以,正如第二个答案所示),这也允许您在多个列上创建唯一约束,以及对同一表格的多个 FK。不能使用 CONSTRAINT 关键字来设置非空约束;更改非空约束需要 ALTER TABLE MODIFY COLUMN ... null。约束名称必须小于或等于30个字符。使用标准命名约定。个人而言,我总是使用表格名称作为约束名称的前缀加上列名称,如果约束名称超过30个字符,则去除元音字母,然后添加约束类型(pk、fk、uk 等)。


虽然我可以看到你的回答很整洁,但是在这种情况下我会采用w0lf的回答,因为它符合我的需求。 - Rumpleteaser
11
请注意,@LauraHansen,将约束条件添加到表定义末尾的语法更加灵活,以防您需要多列约束。 - Aaron Bertrand
3
根据@AaronBertrand的评论,这是更正确的答案。然而,需要注意的是,在至少MSSQL中,约束名的最大长度为128个字符。 - Ian Kemp
我真的觉得内联约束更容易阅读和验证。它减少了重复,清楚地说明了适用对象,而不需要验证名称。 - Aluan Haddad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接