Удаление таблицы с FOREIGN KEY в MySQL

Допустим мы создали таблицу

CREATE TABLE IF NOT EXISTS `Inventory`.`Equipment` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
     `category_id` INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY (`id`),
    FOREIGN KEY (`category_id`) REFERENCES EquipmentCategory(`id`)
        ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Тогда при попытке удалить таблицу (или хотя бы ключ) получим сообщение

DROP TABLE IF EXISTS `Inventory`.`Equipment`;
-- [HY000][152] Cannot delete or update a parent row: a foreign key constraint fails ()

Чтобы удалить таблицу, нужно сначала удалить CONSTRAINT, потом индекс, а только потом таблицу.
Сначала узнаем название CONSTRAINTа:

SHOW CREATE TABLE `Inventory`.`Equipment`;

--create table Inventory.Equipment (
--  id int unsigned not null,
--  category_id int unsigned not null,
--  primary key (id),
--  foreign key Equipment_ibfk_1 (category_id) references EquipmentCategory(id)
--);
--create index category_id on Inventory.Equipment (category_id);

Берём название Equipment_ibfk_1 и далее:

ALTER TABLE `Inventory`.`Equipment` DROP FOREIGN KEY `Equipment_ibfk_1`;
ALTER TABLE `Inventory`.`Equipment` DROP KEY `category_id`;
DROP TABLE IF EXISTS `Inventory`.`Equipment`;

Потом можно восстановить

 ALTER TABLE `Inventory`.`Equipment` ADD     FOREIGN KEY (`category_id`) REFERENCES `EquipmentCategory`(`id`)
         ON DELETE RESTRICT;

А на будущее лучше пользоваться более полным синтаксисом создания внешних ключей — http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

LEAVE A COMMENT