mysql - 如果发现不存在的键,则使用已知键更新多行而不插入新行

标签 mysql insert

假设我们有表格项目...

table: items
item_id INT PRIMARY AUTO_INCREMENT
title VARCHAR(255)
views INT

让我们想象它充满了类似的东西

(1, item-1, 10),
(2, item-2, 10),
(3, item-3, 15)

我想根据从此数组 [item_id] => [views] 获取的数据为该项目创建多重更新 View

'1' => '50',
'2' => '60',
'3' => '70',
'5' => '10'

重要!请注意,数组中有 item_id=5,但数据库中没有 item_id=5。

我可以使用INSERT ... ON DUPLICATE KEY UPDATE,但这样 image_id=5 将被插入到 talbe 项目中。如何避免插入新 key ?我只想跳过 item_id=5,因为它不在表中。

当然,在执行之前我可以从 items 表中选择现有的键;然后与数组中的键进行比较;删除不存在的 key 并执行INSERT ... ON DUPLICATE KEY UPDATE。但也许有一些更优雅的解决方案?

谢谢。

最佳答案

您可以尝试生成文字表并通过连接该表来更新项目:

UPDATE items
    JOIN (SELECT 1 as item_id, 50 as views
          UNION ALL
          SELECT 2 as item_id, 60 as views
          UNION ALL
          SELECT 3 as item_id, 70 as views
          UNION ALL
          SELECT 5 as item_id, 10 as views
          ) as updates
         USING(item_id)
 SET items.views = updates.views;

关于mysql - 如果发现不存在的键,则使用已知键更新多行而不插入新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2579340/

相关文章:

mysql - 从本周获取生日

mysql - 如果不存在则sql插入,否则(完全不同)更新

插入选择中的Mysql自动增量错误

php - 在第二个 PHP 页面上未选取表单上的选定回复

mysql - 第一次无法打开MySQL

mysql - 使用单个 MySQL 查询获取动态结果

java - 在 Java 中插入 Oracle 嵌套表

java String.replaceAll 两个数字之间的字符

mysql - 使用 visual studio CLR/C 在 mysql 中插入变量

mysql - 如何使用 group_concat 并计算其中的每条记录?