2009-07-02 2 views
0

У меня возникли проблемы с использованием ограничений.У меня проблемы с ограничениями 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 ; 

ответ

1

Синтаксис внешних ключей кажется мне необычным.

Вместо:

ADD CONSTRAINT `link_item_store_ibfk_2` FOREIGN KEY (`fk_itemID`) REFERENCES `link_item_store` (`fk_itemID`) ON DELETE CASCADE 

Try:

ADD CONSTRAINT `link_item_store_ibfk_2` FOREIGN KEY (`fk_itemID`) REFERENCES item (`itemID`) ON DELETE CASCADE 

(Предполагая itemID это имя правильной колонке на таблице элементов)

+0

Ваше право .... это не кажется правильным ... но это код, созданный PhpMyAdmin. Он генерирует внешний ключ и сам ссылается ???: ALTER TABLE 'link_item_store' ADD FOREIGN KEY (' fk_itemID') ССЫЛКИ 'mydatabase'.'link_item_store' (' fk_itemID') ON DELETE CASCADE; – Steven

+0

Спасибо, Майкл за голову. Мне удалось это решить. См. Обновленное сообщение выше. – Steven

+0

Рад, что я мог помочь! –

1

Если вы удалите элемент 7, как это сделать в других магазинах?

Поведение, которое вы видите, называется «каскадные удаления». Каждая строка, которая ссылается на строку, которую вы удаляете с помощью FK, также удаляется. Существует также нормальное поведение, не позволяющее удалить, и поведение «set null», которое изменит все FK на удаленный элемент на NULL. Похоже, это то, что вы хотите.

Вот link, говорящий о разных вариантах.

+0

Привет Col. Там нет смысла иметь строки содержат значение NULL в справочной таблице ссылок.Если я удалю элемент с ID = 35 из таблицы «item», я хочу удалить все строки в 'link_item_store', у которого есть fk_itemID = 35. Я думал, что добавление ограничения сделает это для меня. Я не знаю, почему он удаляет все остальные строки. Я несколько раз читал главу «Ограничения FOREIGN KEY» в MySQL, но я не мудрее. – Steven

+0

«Моя проблема в том, что если я удалю« элемент 7 »из таблицы« item », ВСЕ ссылки удаляются из link_item_store». Я предположил, что ссылки означают ссылки на удаленный элемент – colithium

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

  • Нет связанных вопросов^_^