我在使用约束时遇到了一些麻烦。
我有三个表,'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
我的问题是,如果我从'item'表中删除'item 7',则会从link_item_store中删除所有引用。 :(
怎么办?
更新 通过在表上具有这两个约束,我无法向表中插入新数据。我收到以下错误消息:
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')
更新2 - 解决方案: 迈克尔向我指出ADD CONSTRAINT看起来并不合适。仔细看,我看到他是对的。这是PhpMuAdmin在添加约束时生成的代码:
ALTER TABLE `link_item_store` ADD FOREIGN KEY ( `fk_itemID` ) REFERENCES `mydatabase`.`link_item_store` (`fk_itemID`) ON DELETE CASCADE ;
正如你所看到的,外键正在为自己提供帮助!这肯定是PhPMyAdmin中的一个错误。
解决方案是改变参考。这有效,我不再在向表中添加新记录时遇到问题:
ALTER TABLE `link_item_store` ADD FOREIGN KEY ( `fk_itemID` ) REFERENCES `mydatabase`.`item` (`id`) ON DELETE CASCADE ;
答案 0 :(得分:1)
如果删除第7项,其他商店如何拥有它?
您看到的行为称为“级联删除”。引用您使用FK删除的行的每一行也将被删除。还有一个不允许删除的正常行为,以及一个“set null”行为,它将所有FK更改为已删除的项目为NULL。听起来这就是你想要的。
以下是关于不同选项的link。
答案 1 :(得分:1)
外键的语法对我来说似乎不太常见。
而不是:
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_2` FOREIGN KEY (`fk_itemID`) REFERENCES item (`itemID`) ON DELETE CASCADE
(假设itemID
是项目表上正确列的名称)