MySQL关于重复键删除

标签 mysql sql sql-update duplicates

我正在寻找一个(不太复杂的)解决方案来解决 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/

相关文章:

mysql - 导入 sql 表时由于排序规则而出错

php - Mysql关系和获取链接数据

c# - 使用和交易

mysql - 如何将文件 .mdf 和 .ldf 转换为 mysql 格式

PHP:使用子查询更新语句时出错

mysql - 在 mysql 中使用 subselect 更新列时遇到问题

mysql - 设置master数据库来控制其他数据库的结构

mysql - 无法使用服务名称连接到 docker-compose 中定义的 mysql 容器

mysql - 如何用百分比值更新Mysql数据库表

mysql - 任何优化此查询的建议