У меня возникли проблемы с использованием ограничений.У меня проблемы с ограничениями MySQL
У меня есть три таблицы: «item», «store» и «link_item_store». Товар может быть в одном или нескольких магазинах, и один или несколько магазинов могут иметь товар. Поскольку это отношение много-много, я использую 'link_item_store' для нормализации.
Если я удалю элемент, я должен удалить все объекты этого элемента в таблице «link_item_store». И то же самое касается магазина. Это мой стол, и это ограничение:
CREATE TABLE `link_item_store` (
`fk_storeID` int(11) unsigned NOT NULL,
`fk_itemID` int(11) unsigned NOT NULL,
PRIMARY KEY (`fk_storeID`,`fk_itemID`),
KEY `fk_storeID` (`fk_storeID`),
KEY `fk_itemID` (`fk_itemID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci;
ALTER TABLE `link_item_store`
ADD CONSTRAINT `link_item_store_ibfk_2` FOREIGN KEY (`fk_itemID`) REFERENCES `link_item_store (`fk_itemID`) ON DELETE CASCADE,
ADD CONSTRAINT `link_item_store_ibfk_1` FOREIGN KEY (`fk_storeID`) REFERENCES `link_item_store` (`fk_storeID`) ON DELETE CASCADE;
И Heres примера список:
fk_storeID, fk_itemID, itemName, storeName
11 7277 item 1 Test store
11 7278 item 2 Test store
11 7280 item 3 Test store
12 7277 item 1 Test store 2
12 7278 item 2 Test store 2
12 7290 item 4 Test store 2
35 7295 item 4 Test store 4
35 7299 item 5 Test store 4
35 7300 item 6 Test store 4
35 7302 item 7 Test store 4
Моя проблема заключается в том, что если я удалю «пункта 7» от «пункта» таблицы, все ссылки будут удалены от link_item_store. :(
Что делать
Update:. Имея эти два ограничения на столе, я не могу вставить новые данные в таблицу я получаю следующее сообщение об ошибке:
Unable to query local database <b>Cannot add or update a child row: a foreign
key constraint fails (`link_item_store`, CONSTRAINT
`link_item_store_item_ibfk_1` FOREIGN KEY (`fk_storeID`) REFERENCES
`link_item_store` (`fk_storeID`) ON DELETE CASCADE)</b><br> INSERT INTO
link_item_store (fk_storeID, fk_itemID) VALUES ('11', '7295')
Update 2 - Решение. Майкл указал мне, что ADD CONSTRAINT не смотрел прямо на пристальный взгляд, я увидел, что он был прав, это код, который генерируется PhpMuAdmin на. добавление ограничения с:
ALTER TABLE `link_item_store` ADD FOREIGN KEY (`fk_itemID`) REFERENCES `mydatabase`.`link_item_store` (`fk_itemID`) ON DELETE CASCADE ;
Как вы можете видеть, внешний ключ подает себе! Это defenetily должно быть ошибкой в PhPMyAdmin.
Решение должно было изменить ссылку. Это работает, и у меня больше нет проблем с добавлением новых записей в таблицу:
ALTER TABLE `link_item_store` ADD FOREIGN KEY (`fk_itemID`) REFERENCES `mydatabase`.`item` (`id`) ON DELETE CASCADE ;
Ваше право .... это не кажется правильным ... но это код, созданный PhpMyAdmin. Он генерирует внешний ключ и сам ссылается ???: ALTER TABLE 'link_item_store' ADD FOREIGN KEY (' fk_itemID') ССЫЛКИ 'mydatabase'.'link_item_store' (' fk_itemID') ON DELETE CASCADE; – Steven
Спасибо, Майкл за голову. Мне удалось это решить. См. Обновленное сообщение выше. – Steven
Рад, что я мог помочь! –