0

満足できない関数が1つあります。この関数は、テーブルから商品を削除します。

次に、その製品のすべてのカテゴリ、タグ、およびバリアントが削除され、各バリアントについて、そのすべての画像、ドキュメント、および値が削除されます。

これは、2つの選択クエリと6つの削除クエリになります。

これをデータベース集約度を下げる方法はありますか?

delete from $this->table where id = $id
delete from $this->clink where product_id = $id
delete from $this->tlink where product_id = $id

$variants = select id from $this->vlink where product_id = $id //e.g. (1,2) 

delete from $this->vlink where product_id = $id
delete from cart_variant_values where variant_id in $variants
delete from cart_variant_images where variant_id in $variants
delete from cart_variant_documents where variant_id in $variants

私は次のようなことができることを望んでいました:

variants = select id from $this->vlink where product_id = $id //e.g. (1,2) 

delete from $this->table where id = $id
delete from $this->clink, $this->tlink, $this->vlink where product_id = $id
delete from cart_variant_values, cart_variant_images, cart_variant_documents  
where variant_id in $variants

しかし、明らかにそれは機能しません!


編集(2012年11月21日):

これは機能しますか?

DELETE vi, vv, vd, v, p, pc, pt
FROM cart_variant_images vi 
INNER JOIN cart_variant_values vv 
INNER JOIN cart_variant_documents vd 
INNER JOIN cart_product_variants v ON vd.variant_id = v.id
INNER JOIN cart_products p ON v.product_id = p.id
INNER JOIN cart_products_categories pc ON p.id = pc.product_id
INNER JOIN cart_products_tags pt ON p.id = pt.product_id
WHERE p.id = $id;

そのクエリはエラーをスローしませんが、それが私が望むことをするかどうか疑問に思っていますか?

各テーブルには異なる量の行があることに注意してください。内部結合は正しい結合ですか?

4

2 に答える 2

3

で外部キーを使用するON DELETE CASCADE

于 2012-11-20T11:09:01.680 に答える
2

とにかく、結局、データベースは同じことをしなければなりません。

ただし、一度呼び出して$idと$variantsを渡すだけですべてのものを削除するストアドプロシージャを作成することで、接続を最小限に抑えることができます。

http://msdn.microsoft.com/en-us/library/aa174792%28v=sql.80%29.aspx

于 2012-11-20T11:12:43.623 に答える