MySQL 插入 - "on duplicate"的专门操作

标签 mysql

我一直在尝试使用复合主键和唯一索引,试图让它正常工作,但进展缓慢。

我正在尝试创建一个插入序列,添加全新的记录,忽略完全重复的记录,对于具有重复键不同值的记录,我想将旧记录标记为已删除(使用delete_id)并插入新记录一。

假设这是现有的表...

group  | item  | value  | delete_id
-----------------------------------
group1 | item1 | 123    | null
group2 | item1 | 129    | null
group2 | item2 | 137    | null
group2 | item3 | 155    | null
group3 | item1 | 167    | null

我想插入以下记录

group  | item  | value  
-----------------------
group2 | item1 | 129    (duplicate)
group2 | item2 | 9999   (different value)
group2 | item4 | 1      (new item)

我希望结果是这样的

group  | item  | value  | delete_id
-----------------------------------
group1 | item1 | 123    | null
group2 | item1 | 129    | null  (duplicate unaffected)
group2 | item2 | 137    | 1     (flag delete)
group2 | item3 | 155    | null 
group3 | item1 | 167    | null
group2 | item2 | 9999   | null  (new insert)
group2 | item4 | 1      | null  (new insert)

此外,每次都会插入整个组,因此新插入中未包含的任何项目也应标记为已删除...... 我希望结果看起来像这样

group  | item  | value  | delete_id
-----------------------------------
group1 | item1 | 123    | null
group2 | item1 | 129    | null  (duplicate unaffected)
group2 | item2 | 137    | 1     (flag delete - replaced)
group2 | item3 | 155    | 1     (flag delete - omitted)
group3 | item1 | 167    | null
group2 | item2 | 9999   | null  (new insert)
group2 | item4 | 1      | null  (new insert)

最佳答案

groupitemvalue添加唯一约束。

ALTER TABLE `yourTable` ADD UNIQUE `unique_index` (`group`, `item`, `value`);

在更新组之前,将 delete_id 标志设置为 1

UPDATE `yourTable` SET `delete_id` = 1 WHERE `group` = "group2";

然后使用以下命令更新组:

INSERT INTO `yourTable` (`group`, `item`, `value`)
VALUES
  ("group2", "item1", 129),
  ("group2", "item2", 9999),
  ("group2", "item4", 1)
ON DUPLICATE KEY UPDATE
  `delete_id` = null;

看看 fiddle .

关于MySQL 插入 - "on duplicate"的专门操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30870950/

相关文章:

mysql - MySQL加载数据失败

php - "Triple Join"?? INNER-JOIN 是否可以添加 'l query after ' WHERE' 以排除第三个表中的行?

mysql - 从特定表中最后插入的 id

php - 我如何通过where列值从mysql数据库获取行

php - 大数按位运算符

jquery - 设计 SQL 查询构建器

php - 强制MySQL写回

php - 向数组中的图像添加时间戳

mysql - 从命令行在 CentOS 上正常重启(担心数据库损坏)

php - 创建对数据库条目的安全 anchor 引用