MySQL上的重复密钥删除

MySQL上的重复密钥删除,mysql,sql,sql-update,duplicate-removal,Mysql,Sql,Sql Update,Duplicate Removal,我正在为MySQL问题寻找一个(不太复杂的)解决方案。假设我有下表(关于组和项目的联合索引): 然后,最终,项目a不再属于组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) 我仍然想用nogrou

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

然后,最终,项目a不再属于组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保留一份记录副本,因为如果稍后项目a返回,我可以根据情况将其组更改回组a或任何其他组。每当添加项目_a时,都会有一个insert,它会复制nogroup记录中的所有数据,并设置一个正确的组标签。此时,项目a有两条记录:一条为组a,另一条为无组。这样做的原因是尽可能地重用以前的数据,因为新条目(没有以前的记录)涉及的内容要多得多,并且需要花费更多的时间和处理

假设某个项目属于组a和组b,但突然它不属于任何组:将组设置为“nogroup”的第一次更新将起作用,但第二次更新将创建重复的键输入错误

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

基本上,一个项目可以属于1)任何数量的组,包括“nogroup”或2)仅属于“nogroup”,并且在数据库中的某个位置应该始终至少有一个nogroup的副本


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

这篇评论太长了

将这些项目维护到组映射的整个过程听起来太复杂了。为什么不只是拥有一个具有映射的表呢?然后,当项目从组中删除时,将其从表中删除。添加后,将其添加到表中。不要为“无组”而烦恼

如果需要存档表,请创建一个。具有
插入
/
更新
/
删除
触发器(以适当的为准),该触发器将使用您希望随时间保留的信息填充存档

我不明白为什么重新使用现有行在性能方面会有好处。没有明显的数据库原因说明为什么会出现这种情况


我还不明白为什么需要一个“nogroup”标记。如果需要项目列表,请在其自己的表中维护该列表。并将表格称为
——这是一个比“nogroup”更清晰的名称。

我同意戈尔丹的方法。但是,如果必须使用单个表执行此操作,则无法在1SQL查询中执行此操作。您必须使用两个查询,一个用于更新,一个用于删除。

我有一个解决方案;我只做了两次(查询),一次插入,一次清理。我只是想知道是否有人会有一个聪明的方法在一个过程中做到这一点(将简化过程,并确保没有遗漏)。插入一个新记录绝对不是问题——获取进入该记录的信息是问题所在,但我已经处理好了。不过,从谷歌上要求“关键重复删除更新”的人数来看,或许这应该被视为一种选择。感谢您的时间和回复。
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)