作成したテーブルに外部キー制約を追加するためにまず対象のカラムの外部キー制約を削除する必要があるらしい。
ここにたどり着くまで時間がかかったので自分用にメモ。
やりたいこと
threadテーブルのidを外部キーとして参照しているcommentsテーブルのthreadIdに、thread.idが削除されたらcommentsのレコードも削除されるように設定したい。
テーブルの構造、外部キーの名前を確認
外部キーの名前は”comments_ibfk_1”と"comments_ibfk_2"であることがわかる。
mysql> show create table comments;
+----------+--------------------------------------------------+
| Table | Create Table
+----------+--------------------------------------------------+
| comments | CREATE TABLE `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`threadId` int(11) DEFAULT NULL,
`userId` int(11) NOT NULL,
`body` varchar(700) COLLATE utf8mb4_bin DEFAULT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `userId` (`userId`),
KEY `fk_cmt_th_id` (`threadId`),
CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`threadId`) REFERENCES `thread` (`id`),
CONSTRAINT `comments_ibfk_2` FOREIGN KEY (`userId`) REFERENCES `users` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
+----------+--------------------------------------------------+
1 row in set (0.00 sec)
外部キー制約をいったん削除する
新しく外部キー制約を追加する場合、対象になっている外部キー制約を削除する必要があるらしい。
今回はthreadIdにCASCADEを追加したいので"comments_ibfk_1"の制約を削除する。
mysql> ALTER TABLE comments DROP FOREIGN KEY comments_ibfk_1;
//ALTER TABLE テーブル名 DROP FOREIGN KEY 外部キー名;
外部キーの再設定
"ON DELETE CASCADE"は、親テーブルのデータの削除に伴い、それを外部キーとしているデータも削除するという制約。"ON UPDATE CASCADE"は親テーブルのデータの更新と連携する。
mysql>ALTER TABLE comments ADD CONSTRAINT comments_ibfk_1 FOREIGN KEY (threadId) REFERENCES thread(id) ON DELETE CASCADE ON UPDATE CASCADE;
//ALTER TABLE テーブル名 ADD CONSTRAINT 外部キー名 FOREIGN KEY (対象のカラム名) REFERENCES 親テーブル名(参照元カラム名) ON DELETE CASCADE ON UPDATE CASCADE;
結果
threadのidを参照元としてthreadIdを設定した外部キーcomments_ibfk_1に、CASCADEの制約が追加されたことがわかる。
mysql> show create table comments;
+----------+--------------------------------------------------+
| Table | Create Table
+----------+--------------------------------------------------+
| comments | CREATE TABLE `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`threadId` int(11) DEFAULT NULL,
`userId` int(11) DEFAULT NULL,
`body` varchar(700) COLLATE utf8mb4_bin DEFAULT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `comments_ibfk_1` (`threadId`),
KEY `userId` (`userId`),
CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`threadId`) REFERENCES `thread` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `comments_ibfk_2` FOREIGN KEY (`userId`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
+----------+--------------------------------------------------+
1 row in set (0.00 sec)