18:18:46 ALTER TABLE location DROP INDEX unique_name_to_supplier 错误
代码:1553。无法删除索引“unique_name_to_supplier”:需要在
外键约束 0.063 秒
这意味着您正在尝试删除用于 FK 的索引。
MySQL 需要外键和引用键的索引,以便
外键检查可以很快并且不需要表扫描。在里面
引用表,必须有外键所在的索引
列按相同顺序列为第一列。这样一个
如果没有,则在引用表上自动创建索引
存在。如果您创建,此索引可能会在稍后被静默删除
另一个可用于强制外键约束的索引。
index_name,如果给定,则如前所述使用。
http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html
所以你需要修复:
1.摆脱FK
2.删除索引本身
3.再次创建FK
命令如下:
#removing FK
ALTER TABLE `location` DROP FOREIGN KEY `FK_SUPPLIER`;
#droping unique Index
ALTER TABLE `location` DROP INDEX `unique_name_to_supplier` ;
#creating new FK with proper Index
ALTER TABLE `location`
ADD INDEX `FK_SUPPLIER_idx` (`supplier_id` ASC);
ALTER TABLE `location`
ADD CONSTRAINT `FK_SUPPLIER`
FOREIGN KEY (`supplier_id`)
REFERENCES `supplier` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
完整的 sql 日志:
mysql>
mysql> CREATE TABLE supplier (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.38 sec)
mysql> CREATE TABLE location (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> name VARCHAR(10) NOT NULL,
-> supplier_id INT UNSIGNED NOT NULL
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.32 sec)
mysql> ALTER TABLE location ADD CONSTRAINT FK_SUPPLIER FOREIGN KEY FK_SUPPLIER (supplier_id)
-> REFERENCES supplier (id) ON DELETE RESTRICT ON UPDATE RESTRICT;
Query OK, 0 rows affected (0.41 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE location ADD UNIQUE INDEX unique_name_to_supplier (supplier_id,name);
Query OK, 0 rows affected (0.24 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table location;
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table
|
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| location | CREATE TABLE `location` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL,
`supplier_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_name_to_supplier` (`supplier_id`,`name`),
CONSTRAINT `FK_SUPPLIER` FOREIGN KEY (`supplier_id`) REFERENCES `supplier` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
mysql>
mysql>
mysql>
mysql> ALTER TABLE `location` DROP FOREIGN KEY `FK_SUPPLIER`;
Query OK, 0 rows affected (0.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
mysql> ALTER TABLE `location` DROP INDEX `unique_name_to_supplier` ;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
mysql> ALTER TABLE `location`
-> ADD INDEX `FK_SUPPLIER_idx` (`supplier_id` ASC);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE `location`
-> ADD CONSTRAINT `FK_SUPPLIER`
-> FOREIGN KEY (`supplier_id`)
-> REFERENCES `supplier` (`id`)
-> ON DELETE NO ACTION
-> ON UPDATE NO ACTION;
Query OK, 0 rows affected (0.68 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table location
-> ;
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table
|
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| location | CREATE TABLE `location` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL,
`supplier_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_SUPPLIER_idx` (`supplier_id`),
CONSTRAINT `FK_SUPPLIER` FOREIGN KEY (`supplier_id`) REFERENCES `supplier` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+