我一直在玩复合主键和唯一索引,试图让它正常工作但无法快速完成。
我正在尝试创建一个插入序列,添加全新的记录,忽略完全重复的记录,对于具有重复键不同值的记录,我想将旧记录标记为已删除(使用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)
答案 0 :(得分:0)
在group
,item
和value
上添加唯一约束。
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。