MySQL重复密钥删除

时间:2014-10-04 19:27:49

标签: mysql sql sql-update duplicate-removal

我正在寻找一个解决MySQL问题的解决方案(不太复杂)。假设我有下表(在组和项目上有联合索引):

Group     item
nogroup   item_a
group_a   item_a

然后,最终,item_a不再属于group_a。所以我想做一些事情:

update table set group = "nogroup" where item = "item_a" on duplicate key delete.
(obviously this is not a valid symtax but I am looking for a way around this)

我仍然希望用nogroup保留记录的副本,因为如果稍后,item_a返回,我可以根据情况将其组更改回group_a或任何其他组。每当添加item_a时,都会有一个插入,它会复制nogroup记录中的所有数据并设置正确的组标签。此时,item_a有两条记录:一条记录​​有group_a,另一条记录没有组。这样做的原因是尽可能多地重用以前的数据,因为新的条目(没有先前的记录)涉及更多,并且需要更多的时间和处理。

假设一个项目属于group_a和group_b但突然它不属于任何组:第一次更新将组设置为" nogroup"将工作,但第二次更新将创建一个重复的键输入错误。

"根本不更新组列的选项"并使用"插入重复密钥更新"不起作用,因为当组不同时不会重复,这将导致项目不再属于某个组的情况,但该记录仍将存在于数据库中。验证是否" nogroup"的选项首先存在,然后将其更新为特定组也不起作用,因为如果item_a属于多个组,则会将所有其他记录更新为同一组。

基本上,一个项目可以属于1)任意数量的组,包括" nogroup"或2)完全属于" nogroup"并且在数据库中的某处应该始终存在至少nogroup的副本。

看起来我只能在一个查询中做到这一点,但如果某人有一个干净的方式处理这个问题,那将非常感激。也许我上面的一些假设是错误的,并且有一种简单的方法可以做到。

2 个答案:

答案 0 :(得分:5)

评论太长了。

维护此项目到组映射的整个过程听起来太复杂了。为什么不只有一个具有映射的表?然后,从组中删除项目时,将其从表中删除。添加后,将其添加到表中。不要为" nogroup"而烦恼。

如果需要存档表,请创建一个。拥有insert / update / delete触发器(以适用者为准)将使用您希望随时间保留的信息填充档案。

我不明白为什么重新使用现有行在性能方面会有所帮助。 数据库没有明显的原因。

我也很困惑为什么你需要一个" nogroup"标签。如果需要项目列表,请将该列表保留在自己的表中。并拨打表Items - 比#34; nogroup"更清晰的名称。

答案 1 :(得分:0)

我同意Gordan的做法。但是,如果必须使用单个表,则无法在1个SQL查询中完成。您将不得不使用2个查询1进行更新,1个进行删除。