我正在寻找一个(不太复杂的)解决方案来解决 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 的副本。
看起来我无法仅通过一个查询来完成此操作,但如果有人有一种干净的方法来处理此问题,那将非常感激。也许我上面的一些假设是错误的,有一个简单的方法可以做到这一点。
最佳答案
维护此项目到组映射的整个过程听起来太复杂了。为什么不只拥有一个具有映射的表呢?然后,当从组中删除某个项目时,将其从表中删除。添加后,将其添加到表中。不要为“nogroup”而烦恼。
如果您想要一个存档表,请创建一个。拥有一个插入
/更新
/删除
触发器(以适当者为准),该触发器将使用您希望随时间保留的信息填充存档.
我不明白为什么重新使用现有行会对性能有利。没有明显的数据库原因来解释为什么会出现这种情况。
我也很困惑为什么你根本需要一个“nogroup”标签。如果您需要项目列表,请将该列表维护在其自己的表中。并将表命名为Items
——一个比“nogroup”更清晰的名称。
关于MySQL关于重复键删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26196354/