🛑

MySQL5.7でカラムが消せないエラー ERROR 1553 (HY000)

2022/10/30に公開

環境

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

参考

https://engineering.mobalab.net/2021/01/19/mysql-cannot-drop-index/
https://oreno-it3.info/archives/544
https://dev.mysql.com/doc/refman/8.0/ja/create-table-foreign-keys.html

Discussion