🛑
MySQL5.7でカラムが消せないエラー ERROR 1553 (HY000)
環境
・MySQLバージョン 5.7.37
・本番DBではエラーにならなかったが、ローカルDBでのみエラーが起こった。
・ローカルDBはDocker化している。
・バックエンドは Django3.1.7
事象
マイグレーションファイルでDB変更を管理していたが、以前に消したはずのカラム(テーブルAのカラムA)がローカルDBにのみ残っていてエラーを吐いた。
具体的には、テーブルBを親とし、カラムAを外部キーとして保持していたテーブルAで、以前にカラムAを削除していたが、テーブルBを削除するマイグレーションを実行した際に、カラムAが外部参照されているから消せないよという下記のエラーになってしまった。
MySQLdb._exceptions.IntegrityError: (1217, 'Cannot delete or update a parent row: a foreign key constraint fails') The above exception was the direct cause of the following exception:
そこでDocker上にあるローカルDBを確認しにいくと、テーブルAにカラムAが残ったままになっていた。(原因はいまだに分からない...)
docker exec -it myapp /bin/bash
mysql -u root -p
SHOW databases;
USE mydb;
SHOW TABLES;
SELECT * FROM table_a;
そこで、カラムAを削除しようと試みるもエラー。
ALTER TABLE table_a DROP COLUMN column_a;
→ERROR 1553 (HY000): Cannot drop index 'table_a_column_a_id_2da48c03_fk_myapp': needed in a foreign key constraint
ALTER TABLE table_a DROP FOREIGN KEY column_a;
→ERROR 1091 (42000): Can't DROP 'column_a'; check that column/key exists
ALTER TABLE table_a DROP INDEX table_a_column_a_id_2da48c03_fk_myapp;
→ERROR 1553 (HY000): Cannot drop index 'table_a_column_a_id_2da48c03_fk_myapp': needed in a foreign key constraint
SHOW CREATE TABLE table_a;
→| table_a | CREATE TABLE `table_a` (
`column_a` char(32) DEFAULT NULL,
`created_at` datetime(6) NOT NULL,
`updated_at` datetime(6) NOT NULL,
`id` char(32) NOT NULL,
`name` varchar(512) NOT NULL,
PRIMARY KEY (`id`),
KEY `table_a_column_a_id_2da48c03_fk_myapp` (`column_a`),
CONSTRAINT `table_a_column_a_id_2da48c03_fk_myapp` FOREIGN KEY (`column_a`) REFERENCES `table_b` (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
ここに至るまで、 table_a_column_a_id_2da48c03_fk_myapp
ってどこから来たの?と思っていたのだが、外部キーの制約名だということが分かった。
解決法
指定するカラム名を変更し、DROP FOREIGN KEY
を使用したことで、無事カラムAを削除できた。
ドキュメントにもちゃんと書いてあった。
ALTER TABLE table_a DROP FOREIGN KEY `table_a_column_a_id_2da48c03_fk_myapp`;
→Query OK, 0 rows affected (0.06 sec)
参考
Discussion