插入&删除MySQL数据库中的行而不进行多次查询

时间:2012-03-22 10:44:40

标签: mysql query-optimization sql-insert sql-delete

在阅读问题之前检查此示例 - 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个查询?

示例http://www.sqlfiddle.com/#!2/fcf3e/8

1 个答案:

答案 0 :(得分:1)

我认为在MySQL中不可能组合DML语句。我知道Oracle和MSSQL有这个合并功能,但我认为MySQL没有这个功能,但我不太确定。

看着你的小提琴和代码实际上做了什么,我想出了一个不同的方法。如果循环遍历存在的数据数组并将输出放入1变量并使用delete删除不匹配的行。

这是一个基于你的sqlfiddle的例子(注意数组无效,因为它在小提琴中没有正确命名)

// Declare var and fill with array result
$exists = '';

for ($c = 0; $c < count($array); c++)
{
    if ($c == (count($array) -1))
    {
      $exists .= $array[$c]['product_ids'];
    }
    else
    {
      $exists .= $array[$c]['product_ids'].',';
    }
}

然后,您可以使用一个

进行两次查询
DELETE FROM `foo` WHERE `special_offer_id` NOT IN ('.$exists.');