55

我目前有:

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 中也需要它。

4

2 回答 2

89

在 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

于 2013-01-24T22:22:15.783 回答
49
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 上创建 UNIQUE 约束到同一张桌子。CONSTRAINT 关键字不能用于非空;对非空约束的更改需要 ALTER TABLE MODIFY COLUMN ... null。约束名称必须少于或等于 30 个字符。使用标准命名约定。就个人而言,我总是使用列名前面的表名,如果约束名称超过 30 个字符,则将其删除,然后是约束类型(pk、fk、uk 等)

于 2013-01-24T22:19:42.250 回答