2013-01-24 8 views
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 
); 

しかし、自動車はそれが難しい後で制約を削除するために作るの名前を生成して、これは制約を追加します。制約に名前を付けるために追加する必要があるのは何ですか?

上記の例では、私はまた、制約の名前を指定するには、CONSTRAINTキーワードを使用postgresqlの

+0

は、[テーブルの作成](http://msdn.microsoftある

はここで更新されたスクリプトです.com/ja-jp/library/ms174979.aspx)を参照してください。 'rowguid uniqueidentifier ROWGUIDCOL NOT NULL CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT(newid())' – Hiten004

答えて

52

SQL Serverでは、 constraintキーワードを使用して、外部キーをインラインで定義し、同時に名前を付けます。私はちょうどテストをしたと明らかに同じことがまた、PostgreSQLでは動作します

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

:ここhttp://www.sqlfiddle.com/#!12/2ae29

+1

Sqliteではそれがうまく機能します。 – PaulP

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

でそれを必要とMSSQLです。 IMOこれは、第2の答えが示すように、どちらも受け入れ可能であり、インラインではなく、このエンドオブテーブルを行うために、よりクリーンで読みやすいです。これにより、複数のFKだけでなく、複数の列に対してUNIQUE制約を作成することもできます同じテーブルにNOT NULLにはCONSTRAINTキーワードを使用できません。 NOT NULL制約の変更には、ALTER TABLE MODIFY COLUMN ... NULLが必要です。制約名は30文字以下でなければなりません。標準的な命名規則を使用してください。個人的には、制約名が30文字以上で、制約の種類(pk、fk、ukなど)が続く場合には、テーブル名を列名の前に常に使用します。

+0

私はあなたの答えがきちんと見える間、私はあなたが探しているものに合っているので、このケースでw0lfの答えを適用します。 – Rumpleteaser

+7

@LauraHansenは、テーブル定義の最後に制約を追加する構文は、複数列の制約がある場合に、より柔軟性があることに留意してください。 –

+1

これは、@ AaronBertrandのコメントによるより正しい答えです。ただし、少なくともMSSQLでは、制約名の最大長は128文字であることに注意することが重要です。 –

関連する問題