2009-07-02 21 views
0

制約を正しく使用する上で問題があります。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 ; 

答えて

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と仮定すると、アイテムテーブルの上に正しい列の名前です)

+0

あなたの権利....これは正しいように見えませんが、これはPhpMyAdminが生成するコードです。それは外部キーを生成し、それ自身を参照します::ALTER TABLE 'link_item_store'外部キーを追加します( 'fk_itemID')参考mydatabase'.link_item_store'(' fk_itemID')ON DELETE CASCADE; – Steven

+0

マイケルが頭をアップしてくれてありがとう。私はこれを解決することができました。上記の最新の記事を参照してください。 – Steven

+0

うれしい私は助けることができました! –

1

他のストアにはどのようにして保存できますか?

表示されている動作を「カスケード削除」と呼びます。 FKで削除する行を参照するすべての行も削除されます。また、削除を許可しないという通常の動作と、削除されたアイテムへのすべてのFKをNULLに変更する「ヌル設定」動作があります。それはあなたの望むもののように聞こえる。

さまざまなオプションについて話しているlinkです。

+0

こんにちは大佐持つことのない点はありませんリンク参照テーブル内のrows containsintがNULLです。'item'テーブルからID = 35のアイテムを削除すると、fk_itemID = 35の 'link_item_store'のすべての行を削除したいと思います。私は他のすべての行を削除する理由を知りません。私はMySQLでFOREIGN KEY Constraintsの章を何度か読んだことがありますが、私は賢明ではありません。 – Steven

+0

"私の問題は、 'item'テーブルから 'item 7'を削除すると、すべての参照がlink_item_storeから削除されるということです。私は参照が削除された項目への参照を意味すると仮定しました – colithium

関連する問題