2012-02-21 6 views
2

私は関係を完全に理解しようとしており、多くのチュートリアルを行っています。まだ私はいくつかの上に残る(使用MySQLWORKBENCH): enter image description here 1.すべてのユーザーがアップロードできるすべての製品が複数のカテゴリ、入札、評価を持つことができ 2.製品など 3.すべてのユーザが(複数の電話番号 を持つことができますMYSQLモデリング関係:設計と更新/削除

これは正しいですか?: 1 - 私はすべてのユーザーが複数の製品をアップロードできるので、1:nの関係を使用しました。 2および3 IがNを使用した:Mの関係、等複数のカテゴリを有する複数の製品、入札、評価、

DELETE/UPDATEが存在することができるので、私はどこでもどこCASCADEをDELETE UPDATE CASCADEとONで使用 'product'、 'category_tags_has_products'、 'bid_price_has_product'、 'phone_has_user'という外部キーがあります。

私はこのような製品(php)を削除しようとしました:mysql_query( "DELETE FROM product WHERE id = '$ id'"); 1054エラーが発生します。これは外部キーエラーです。 ここでベストプラクティスは何ですか?私が親テーブル以外で削除する必要はないと私は理解していますか?

Thanx!

答えて

1

これは、外部キーが2番目のテーブルの主キーの一部であることを識別する関係が多いことを意味します。これはほとんどの場合必要ではなく、リンクテーブルなどのインスタンスで本当に便利です。

この目的のために、user-> productリンクを非識別に変更すると、user_idが主キーの一部ではなく外部キーになります。ワークベンチでは、1:nの非識別関係のショートカットはキー '2'( '4'が識別している場合)です。これは順番に、製品のリンク先のテーブルからuser_idフィールドを削除する必要があります。

製品を削除すると、リンク先の3つのリンクテーブルにカスケードする必要があります。現時点では、FKの設定方法によってもユーザーから削除しようとしている可能性があります。 > でのproduct_idで任意のテーブルから削除されますが、ユーザーからDELETE - - > user_idを持つ任意のテーブルから削除され、次の生成物からDELETE削除(削除を仮定すると、永久的であり、あなただけのすべてのリンクされたレコードをクリアしたい)

をカスケード接続する必要がありますin

phone、rating、bid_price、category_tagsについても同様です。使用の場合

は、私はあなたが必要な場合はそれ以上のポインタが:)

+0

ユーザー - >製品リンクを非識別に変更しました。 – user1163859

+0

私はこのように削除しています:$ query = "DELETE FROM product WHERE id = '$ id'"; var_dump($ query); mysql_query($ query); – user1163859

+0

$ idが=私はphpMyAdminを直接削除しようとした、そしてそれは私に同じエラーを与える – user1163859

1

リレーションが正しいように見えます。 クエリに何が問題なのか調べるには、$id変数をチェックしてください。 またはクエリ全体をチェックして、コンソール/ phpMyAdminには、/ etcでそれを実行します。

$query = "DELETE FROM product WHERE id='$id'"; 
var_dump($query); 
mysql_query($query); 

P.S:ユーザーから得たすべてのデータをエスケープすることを忘れないでください!

$id = mysql_real_escape_string($_GET['id']); 
+0

感謝を叫ぶこと自由に感じ、これを願っています。しかし、これはまだ動作しません。私は、phpMyAdminのを使用して削除しようとしたが、私はこのエラーを取得: – user1163859

+0

#1451 - 親行を削除または更新できません:外部キー制約は、FOREIGN KEY( 'product_id' fk_category_tags_has_product_product1'(' databasename'.'category_tags_has_product'、制約を '失敗し、' UPDATE CASCADE' ONと 'DELETE CASCADE' ON category_tags_has_product.product_id''にproduct_user_id')DELETE NO AC ON REFERENCES 'product'(' id'、 'user_id')) – user1163859

+0

入れ'。現在、あなたはDELETE' ON 'のためのアクションを持っていないように見える、あなたが' product'テーブルから製品を削除しようとしているとき、対応するレコードは 'category_tags_has_product'テーブルに留まり、あなたは、エラーを取得するためcategory_tags_has_product''内のレコード'product'テーブルの削除された行を指し示します。 – Minras