在阅读问题之前检查这个例子 - 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 个查询?
最佳答案
我认为在 MySQL 中不可能合并 DML 语句。我知道 Oracle 和 MSSQL 有合并功能,但我认为 MySQL 没有这个功能,但我不太确定。
查看您的 fiddle 和代码的实际作用,我想出了一个不同的方法。如果您遍历存在的数据数组并将输出放入 1 个变量并使用 delete 删除不匹配的行。
这是一个基于您的 sqlfiddle 的示例(请注意该数组无效,因为它在 fiddle 中未正确命名)
// 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.');
关于mysql - 无需多次查询即可在 MySQL 数据库中插入和删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9820703/