0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

外部キー制約にCASCADEを追加

Posted at

作成したテーブルに外部キー制約を追加するためにまず対象のカラムの外部キー制約を削除する必要があるらしい。
ここにたどり着くまで時間がかかったので自分用にメモ。

やりたいこと

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?