【发布时间】:2012-03-22 10:44:40
【问题描述】:
在阅读问题之前检查此示例 - http://www.sqlfiddle.com/#!2/fcf3e/8
以下数据来自一个表单,用户只是从特价中删除了一个产品。
Array(
'special_offer_id' => 1,
'product_ids' => Array(
0 => 1,
0 => 2
)
)
本来我想用这个查询...
REPLACE INTO `foo` VALUES (1, 1), (2, 1);
但这不会删除用户删除的产品 - 只会更新其他产品。
所以我不得不执行 2 个查询...
DELETE FROM `foo` WHERE `special_offer_id` = 1;
INSERT INTO `foo` VALUES (1, 1), (2, 1);
有没有更好的方法来做到这一点而不必执行 2 次查询?
【问题讨论】:
-
多查询有什么问题?也许最好的方法是使用存储过程。
-
它们没什么问题,我只是想知道是否有首选的方法。
-
为什么你认为 REPLACE 不会删除记录?使用 SELECT ROW_COUNT() 查询检查这一点。您的 PK 是复合键(product_id、special_offer_id)。
-
因为
REPLACE INTO只会UPDATE数组中的2条记录而忽略被删除的那条。 -
REPLACE 语句首先检查唯一字段(
product_id和special_offer_id),然后删除并插入新记录,或者只是插入新记录。在您的情况下,special_offer_id字段不是唯一的。
标签: mysql query-optimization sql-insert sql-delete