問題背景描述:
首先,創建了一個主表,具有以下數據結構:
mysql> describe aa; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | SecID | int(10) | NO | UNI | NULL | | | name | char(20) | NO | | NULL | | | sex | char(5) | YES | | femal | | +-------+----------+------+-----+---------+----------------+ 4 rows in set (0.01 sec)
然后,創建了一個從表,通過外鍵,與表aa的SecID屬性關聯起來:
mysql> create table bb //創建表bb -> (SecID int(10) unique not null, -> room_num int(5) not null, -> extra binary default 0) -> engine=InnoDB; Query OK, 0 rows affected (0.10 sec)
mysql> alter table bb add foreign key(SecID) references aa(SecID); //添加外鍵 Query OK, 0 rows affected (0.14 sec) Records: 0 Duplicates: 0 Warnings: 0
執行對bb表的外鍵刪除操作,出現以下error:
mysql> alter table cc drop foreign key SecID; ERROR 1025 (HY000): Error on rename of './test_20180206/cc' to './test_20180206/#sql2-9ac-e' (errno: 152)
經過分析,筆者發現是因為創建外鍵時,外鍵名與屬性名一樣導致的。
因此,在創建外鍵時,最好加上外鍵的別名設置,以便於外鍵屬性的修改或刪除,命令如下:
mysql> alter table cc add constraint SECID foreign key(SecID) references aa(SecID);
mysql> alter table cc drop foreign key SECID; Query OK, 0 rows affected (0.16 sec) Records: 0 Duplicates: 0 Warnings: 0
目前沒有找到外鍵名與屬性名一致時,刪除外鍵的徹底解決方法。
可以通過命令CREATE TABLE SELECT的命令將表結構及其數據進行備份,此時外鍵屬性是不會被復制的,就可以根據新表重新進行可靠的外鍵設置操作。
