将多个删除查询组合成更少?

时间:2012-11-20 11:07:18

标签: mysql sql query-optimization

我有一个我不满意的功能,该功能会删除表中的产品。

然后删除该产品的所有类别,标签和变体, 并为每个变体删除其所有图像,文档和值。

这归结为两个选择查询和六个删除查询。

有没有办法可以减少数据库密集度?

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;

那个问题让我没有错误,但我想知道它是否能满足我的要求?

请注意,每个表中的行数量会有所不同,因此内连接是右连接吗?

2 个答案:

答案 0 :(得分:3)

将外键与ON DELETE CASCADE

一起使用

答案 1 :(得分:2)

最后,无论如何,数据库必须做同样的事情。

但你可以通过编写一个存储过程来最小化连接,这个过程会在你调用它之后删除所有的东西并传递给他$ id和$ variants

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