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

ただし、これにより、自動生成された名前で制約が追加され、後で制約を削除することが困難になります。制約に名前を付けるには、何を追加する必要がありますか?

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

于 2013-01-24T22:19:42.250 に答える