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

Rum*_*ser 44 sql sql-server postgresql constraints create-table

我目前有:

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
);
Run Code Online (Sandbox Code Playgroud)

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

上面的例子是mssql我也需要它在postgresql中

Cri*_*scu 74

在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
);
Run Code Online (Sandbox Code Playgroud)

我只是做了一个测试,显然同样的东西也适用于PostgreSQL:http://www.sqlfiddle.com/#!12/ 2ae29


Mat*_*sen 37

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)
);
Run Code Online (Sandbox Code Playgroud)

使用CONSTRAINT关键字指定约束名称.IMO它更清晰,更易读,可以做到这个结束而不是内联(两者都可以接受,如第二个答案所示),这也允许你在多个列上创建UNIQUE约束,以及多个FK到同一张桌子.CONSTRAINT关键字不能用于非null; 更改为非空约束需要ALTER TABLE MODIFY COLUMN ... null.约束名称必须小于或等于30个字符.使用标准命名约定.我个人总是使用前面列名的表名,如果约束名超过30个字符,则后面是约束类型(pk,fk,uk等).

  • @LauraHansen只是注意到,如果您有多列约束,在表定义末尾添加约束的语法会更灵活. (9认同)
  • 根据@ AaronBertrand的评论,这是更正确的答案.但是,重要的是要注意,至少在MSSQL中,约束名称最大长度为128个字符. (3认同)