単一のMySQLステートメントで列を追加して外部キーにする方法は?


83

mysqlで、同じステートメントに列と外部キーを追加できますか?そして、fkを追加するための適切な構文は何ですか?

これが私のSQLです:

ALTER TABLE database.table
 ADD COLUMN columnname INT DEFAULT(1),
 FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;

...および付随するエラーメッセージ:

SQL構文にエラーがあります。4行目の「FOREIGNKEY(fk_name)REFERENCES reftable(refcolumn)ON DELETE CASCADE」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

回答:


99

これを試して:

ALTER TABLE database.table
  ADD COLUMN columnname INT DEFAULT(1),
  ADD FOREIGN KEY fk_name(fk_column) REFERENCES reftable(refcolumn) ON DELETE CASCADE;

6
そしてfk_namefk_column私はwhaatを挿入する必要があります...?
c4d 2015

7
@ C4ud3xfk_nameは、識別の目的でこの特定の制約を指定する名前になります(クエリではオプションです)。mysqlはそれも自動生成し、fk_column外部キーとして機能させる参照列です。
ラビアナズカーン2015

1
制約名を明示的に指定することをお勧めします。将来その列を削除したい場合、厄介な問題が発生する可能性があります。システムは、制約に自動的に名前を付ける方法(mariaDBとmySQLなど)についてさまざまなアイデアを持つさまざまなデータベースですでに実行されています。この1行のコードを節約したかったので、ここのように制約を指定しませんでした。代金を支払ってから数か月後に、すべてのシステムで列を削除する移行を記述しようとしました。stackoverflow.com/questions/55374835/...
Alkis Mavridis

39

次のクエリは、変更クエリによって列を追加し、制約クエリはそれを単一のmysqlクエリのFKにします。あなたはこのようにそれを行うことができます、

構文:

ALTER TABLE `SCHEMANAME`.`TABLE1` 
ADD COLUMN `FK_COLUMN` BIGINT(20) NOT NULL, 
ADD CONSTRAINT `FK_TABLE2_COLUMN` FOREIGN KEY (`FK_COLUMN`) 
REFERENCES `SCHEMANAME`.`TABLE2`(`PK_COLUMN`);

例:

ALTER TABLE `USERDB`.`ADDRESS_TABLE` 
ADD COLUMN `USER_ID` BIGINT(20) NOT NULL AFTER `PHONE_NUMBER`, 
ADD CONSTRAINT `FK_CUSTOMER_TABLE_CUSTOMER_ID` FOREIGN KEY (`USER_ID`) 
REFERENCES `USERDB`.`CUSTOMER_TABLE`(`CUSTOMER_ID`); 

3

これは少し単純化できます。「FOREIGNKEY」の前に「ADD」キーワードを追加するだけです。以下に例を追加します。

ALTER TABLE database.table
ADD COLUMN columnname INT DEFAULT(1),
ADD FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;

-3

あなたはそれを使うことができます。

ALTER TABLE database.table
ADD COLUMN columnname INT DEFAULT(1);
ALTER TABLE database.table add FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.