1つのコマンドで外部キー制約を含む新しい列を追加する


128

外部キーとなる新しい列を追加しようとしています。2つの個別のALTER TABLEコマンドを使用して、列と外部キー制約を追加できました。

ALTER TABLE one
ADD two_id integer;

ALTER TABLE one
ADD FOREIGN KEY (two_id) REFERENCES two(id);

2つではなく1つのALTER TABLEコマンドでこれを行う方法はありますか?私はうまくいくものを思いつくことができませんでした。


回答:


185

SQL関連の質問と同じように、DBMSに依存します。一部のDBMSでは、カンマで区切られたALTERテーブル操作を組み合わせることができます。例えば...

Informix構文:

ALTER TABLE one
    ADD two_id INTEGER,
    ADD CONSTRAINT FOREIGN KEY(two_id) REFERENCES two(id);

IBM DB2 LUWの構文も同様で、キーワードADDを繰り返しますが、(図を正しく読んだ場合)追加された項目を区切るためにコンマは必要ありません。

Microsoft SQL Server構文:

ALTER TABLE one
    ADD two_id INTEGER,
    FOREIGN KEY(two_id) REFERENCES two(id);

他のいくつかはそのようなALTER TABLE操作を組み合わせることができません。標準SQLでは、ALTER TABLEステートメントで単一の操作しか許可されないため、標準SQLでは、2つのステップで実行する必要があります。


5
2番目の追加と制約。
Imran

18
SQLパーツの場合、制約に名前を付けるには、次のように記述します。
Dragos Durlut 2016年

78

MS-SQLServerの場合:

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)

これはどのDBエンジンですか?
knocte

@knocte ms SQLサーバー用です-明確にするために質問にタグが付けられました
sqladmin

受け入れ答えはすでにそれを行う方法でDBエンジンの間には大きな違いがあることを述べているように私は私だけではなかったので、何を明確にする必要がありますが、あなたの答えは、質問のニーズが明確とは思わない
knocteを

9
制約に名前を付けます。受け入れられた回答により、システムは名前を生成しますが、これは扱いにくく、後で管理するのが困難です。
Derpy

17

SQL Serverの場合、次のようになります。

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)

1
これは他の回答よりも少し簡潔です。
サム

11

MS SQL SERVER:

ユーザー定義の外部キー名を使用

ALTER TABLE tableName
ADD columnName dataType,
CONSTRAINT fkName FOREIGN KEY(fkColumnName) 
   REFERENCES pkTableName(pkTableColumnName);

ユーザー定義の外部キー名なし

ALTER TABLE tableName
ADD columnName dataType,
FOREIGN KEY(fkColumnName) REFERENCES pkTableName(pkTableColumnName);


2

2020年の更新

かなり古い質問ですが、人々はまだそれに戻ってきています。上記の回答が役に立たなかった場合は、新しい列に他のテーブルのIDと同じデータ型を使用していることを確認してください。

私の場合、私はLaravelを使用していましたが、負のID LOLを持つ意味がないため、すべてのIDに「符号なし整数」を使用しています。

そのため、生のSQLクエリは次のように変更されます。

ALTER TABLE `table_name`
ADD `column_name` INTEGER UNSIGNED,
ADD CONSTRAINT constrain_name FOREIGN KEY(column_name) REFERENCES foreign_table_name(id);

それが役に立てば幸い


1
「ADD CONSTRAINT」は単に「CONSTRAINT」である必要がありますね。
TimH

1

あなたはSQL Serverで以下のようにそれを行うことができます

ALTER TABLE one
ADD two_id int foreign key
REFERENCES two(id)



1

DB2の場合、構文は次のとおりです。

ALTER TABLE one ADD two_id INTEGER FOREIGN KEY (two_id) REFERENCES two (id);

0

テーブルにすでにいくつかの行がある場合にデフォルト値も追加する必要がある場合は、DEFAULT valを追加します

ALTER TABLE one
ADD two_id int DEFAULT 123,
FOREIGN KEY(two_id) REFERENCES two(id);

0

これを試して:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);

1
SOへようこそ!答えがコードの場合はコメントしてください。あなたの場合、あなたの答えとよく似た答えがたくさんあるので、あなたの利点を明らかにしてください。
DavidGarcíaBodego
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.