web-dev-qa-db-ja.com

SQL Createステートメントに名前付き外部キー制約を追加する

私は現在持っています:

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でも必要です

42
Rumpleteaser

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

71
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インラインではなく、このテーブルの終わりを実行する方がクリーンで読みやすく(2番目の答えが示すように、両方とも受け入れられます)、これにより、複数の列と複数のFKにUNIQUE制約を作成することもできます同じテーブルに。 CONSTRAINTキーワードは、非ヌルには使用できません。非NULL制約を変更するには、ALTER TABLE MODIFY COLUMN ... nullが必要です。制約名は30文字以下でなければなりません。標準の命名規則を使用します。個人的には常に、列名の前に付けられたテーブル名を使用します。これは、制約名が30文字を超える場合にデボウエルされ、その後に制約タイプ(pk、fk、ukなど)が続きます。

36
Matthew Moisen