mysql - 无需多次查询即可在 MySQL 数据库中插入和删除行

标签 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

最佳答案

我认为在 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/

相关文章:

sql - 更好的连接查询

postgresql - 我可以在另一个 INSERT 中使用 INSERT...RETURNING 的返回值吗?

java - 使用 jOOQ 和 PostgreSQL serial 和 RETURNING 返回一个值

mysql - 哪个更有效,DELETE 和 INSERT 或 INSERT 和 UPDATE

mysql - 将 S3 数据加载到 Aurora MySQL 实例中

mysql - MySQL 中的逗号分隔变量

postgresql - Postgres : Index not being used or how to optimize

java - 使用 DefaultHttpClient 连接 MySQL

php - 将 SQL 查询插入到 cakephp 的 Controller 中

MySQL 用索引解释过滤列跳跃 4,100