2013-11-06 2 views
0

У меня есть пять таблиц на моем MySQL, все InnoDB.Ошибка внешнего ключа MySQL в таблице соединений

Обычные столы

Table list 
Table proc 
Table views 

ответвительные столы

Table l_p 
Table l_p_views 

CREATE TABLE IF NOT EXISTS `list` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

CREATE TABLE IF NOT EXISTS `proc` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `view` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `l_proc` (
    `listId` int(10) unsigned NOT NULL, 
    `procId` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`listId`,`procId`), 
    KEY `l_process_ibfk_2` (`procId`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE `l_proc` 
    ADD CONSTRAINT `l_proc_ibfk_1` FOREIGN KEY (`listId`) REFERENCES `list` (`id`)  ON  DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `l_proc_ibfk_2` FOREIGN KEY (`procId`) REFERENCES `proc` (`id`) ON  DELETE CASCADE ON UPDATE CASCADE; 

CREATE TABLE IF NOT EXISTS `l_p_view` (
    `listd` int(10) unsigned NOT NULL, 
    `procId` int(10) unsigned NOT NULL, 
    `viewId` int(10) unsigned NOT NULL, 
    KEY `listId` (`listId`,`procId`,`viewId`), 
    KEY `view` (`viewId`), 
    KEY `l_p_view_ibfk_2_idx` (`procId`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE `l_p_view` 
    ADD CONSTRAINT `l_p_view_ibfk_1` FOREIGN KEY (`listId`) REFERENCES `l_proc`  (`listId`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `l_p_view_ibfk_3` FOREIGN KEY (`viewId`) REFERENCES `view` (`id`) ON  DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `l_p_view_ibfk_4` FOREIGN KEY (`procId`) REFERENCES `l_proc`  (`procId`) ON DELETE CASCADE ON UPDATE CASCADE; 

Идея заключается в том, что если удалены, все упомянутые l_proc и l_p_view записывает перечень записи ПОЛУЧИТЬ ныряет удаляется тоже. Это работает по назначению.

Однако, когда я удаляю запись в l_proc как с запросом listId, так и с procId, все записи в l_p_view с одинаковым listId удаляются немедленно - неважно, что их procId отличается от того, что было представлено с оригиналом запрос на удаление для l_proc.

Что мне здесь не хватает?

Rgds, П.

+0

Или в качестве последующего вопроса - может ли таблица иметь два внешних ключа к столбцам на одной таблице? – PMiller

ответ

1

Я хотел бы попробовать заменить это:

ALTER TABLE `l_p_view` 
    ADD CONSTRAINT `l_p_view_ibfk_1` FOREIGN KEY (`listId`) REFERENCES `l_proc`  (`listId`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `l_p_view_ibfk_3` FOREIGN KEY (`viewId`) REFERENCES `view` (`id`) ON  DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `l_p_view_ibfk_4` FOREIGN KEY (`procId`) REFERENCES `l_proc`  (`procId`) ON DELETE CASCADE ON UPDATE CASCADE; 

с этим:

ALTER TABLE `l_p_view` 
    ADD CONSTRAINT `l_p_view_ibfk_1` FOREIGN KEY (`listId`,`procId`) REFERENCES `l_proc`  (`listId`,`procId`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `l_p_view_ibfk_3` FOREIGN KEY (`viewId`) REFERENCES `view` (`id`) ON  DELETE CASCADE ON UPDATE CASCADE, 

Разница в том, что у вас есть составной внешний ключ в последнем смысле, что только те строки в l_p_view, которые соответствуют как list_id, так иproc_id удаленной строки в таблице l_proc будет удалена.

+0

Спасибо Том - это была ошибка в моей настройке fk. Теперь удаление выполнено правильно. – PMiller

Смежные вопросы