【MySQL】外部キーの削除時のエラー1091に対処する方法


ここではMySQLで、外部キーの削除時のエラー1091に対処する方法を紹介しています。

外部キーの削除時のエラー1091に対処する方法

今回は次のようにtab1とtab2の2つのテーブルを作成して、tab1からtab2のdeptカラムに対して外部キーの追加をしてみました。

CREATE TABLE tab1(
 emp_id varChar(10)
 ,emp_name varChar(100)
 ,dept varChar(10) 
 ,age int
 );
CREATE TABLE tab2(
 dept varChar(10)
 ,dept_name varChar(100)
);
ALTER TABLE tab1 ADD FOREIGN KEY fk_dept(dept) REFERENCES tab2(dept);

この外部キーを削除しようとしたところ、次のようなエラーが出ました。

mysql> ALTER TABLE tab1 DROP FOREIGN KEY fk_dept;
ERROR 1091 (42000): Can't DROP 'fk_dept'; check that column/key exists

CREATE TABLE文で確認したところ制約名は別のものが付与されていました。
fk_deptではなく、tab1_ibfk_1となっていました。

mysql> SHOW CREATE TABLE tab1;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                  |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tab1  | CREATE TABLE `tab1` (
  `emp_id` varchar(10) DEFAULT NULL,
  `emp_name` varchar(100) DEFAULT NULL,
  `dept` varchar(10) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  KEY `fk_dept` (`dept`),
  CONSTRAINT `tab1_ibfk_1` FOREIGN KEY (`dept`) REFERENCES `tab2` (`dept`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)

名前をtab1_ibfk_1に変更して削除すると問題なく削除できました。

mysql> ALTER TABLE tab1 DROP FOREIGN KEY tab1_ibfk_1;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0