【问题标题】:Adding named foreign key constraints in a SQL Create statement在 SQL Create 语句中添加命名外键约束
【发布时间】:2013-01-08 19:49: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
);

但这会添加具有自动生成名称的约束,这使得以后很难删除约束。为了命名约束,我需要添加什么?

上面的例子是 SQL Server,我在 PostgreSQL 中也需要它。

【问题讨论】:

  • 这里是来自 MSDN 的 create tablerowguid uniqueidentifier ROWGUIDCOL NOT NULL CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (newid())

标签: sql sql-server postgresql constraints create-table


【解决方案1】:

在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

【讨论】:

    【解决方案2】:
    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 关键字来指定约束名称。 IMO 执行此表结尾而不是内联(两者都是可以接受的,如第二个答案所示)更清洁、更易读,这也允许您在多个列以及多个 FK 上创建唯一约束到同一张桌子。 CONSTRAINT 关键字不能用于非空;对非空约束的更改需要 ALTER TABLE MODIFY COLUMN ... null。约束名称必须少于或等于 30 个字符。使用标准命名约定。我个人总是使用列名前的表名,如果约束名超过30个字符则去元,后跟约束类型(pk、fk、uk等)

    【讨论】:

    • 虽然我可以看到您的答案很简洁,但我将在这种情况下应用 w0lf 的答案,因为它符合我的要求。
    • @LauraHansen 请注意,在表定义末尾添加约束的语法更加灵活,以防您有多列约束。
    • 根据@AaronBertrand 的 cmets,这是更正确的答案。但是,需要注意的是,至少在 MSSQL 中,约束名称的最大长度为 128 个字符。
    • 我真的发现内联约束更容易阅读和验证。重复的次数更少,它适用于什么,而不是必须验证名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2013-04-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多