MySQL插入 - “复制”

时间:2015-06-16 14:46:33

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

1 个答案:

答案 0 :(得分:0)

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