制約を正しく使用する上で問題があります。MySQLの制約に問題があります
私は 'item'、 'store'、 'link_item_store'という3つのテーブルを持っています。 アイテムは1つまたは複数のストアに入れることができ、1つまたは複数のストアにアイテムを含めることができます。 これは多対多の関係なので、私は '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」が「アイテム」テーブルから削除する場合、すべての参照が削除されていることですfrom link_item_store。 :(
何をする
更新:?。テーブルの上にこれらの2つの制約を有することにより が、私はテーブルに新しいデータを挿入することはできないんだけど、私は、次のエラーメッセージが表示されます。
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によって生成されたコードです。制約を加えるs:
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 ;
あなたの権利....これは正しいように見えませんが、これはPhpMyAdminが生成するコードです。それは外部キーを生成し、それ自身を参照します::ALTER TABLE 'link_item_store'外部キーを追加します( 'fk_itemID')参考mydatabase'.link_item_store'(' fk_itemID')ON DELETE CASCADE; – Steven
マイケルが頭をアップしてくれてありがとう。私はこれを解決することができました。上記の最新の記事を参照してください。 – Steven
うれしい私は助けることができました! –