【问题标题】:Remove duplicate rows in MySQL _BUT_ reassign all referential records to kept record删除 MySQL 中的重复行 _BUT_ 重新分配所有参考记录以保留记录
【发布时间】:2013-11-29 16:08:20
【问题描述】:

我正在尝试对我们系统中的用户帐户进行重复数据删除,我知道有很多关于删除/识别重复项的问题(例如 Remove duplicate rows in MySQL),但我没有看到任何需要维护参考的问题记录。

我有一个users 表和一个subscriptions 表,其外键字段User_ID 对两者都通用,并在subscriptions 中设置为CASCADE。

我想删除users 表中的所有重复项,但这样做会由于CASCADE 行为而丢失subscriptions 表中与User_ID 对应的所有记录。

是否可以UPDATEusers 表,将重复记录的User_ID 更改为我想要保留的记录,而不会与唯一索引发生冲突,从而允许所有引用记录相应地更新,最后删除重复的用户记录而不级联删除?

增加的复杂性是用户表中的User_ID字段显然是用unique索引的。


编辑:我应该补充一点,这是一个简化的示例,我们的数据库有 100 多个表,其中许多表具有基于 User_ID 的外键。

【问题讨论】:

  • 获取欺骗用户列表,选择“保留”的用户。获取该保留列表,并更新订阅表,以便将 dupeuser->sub 更改为 keepuser->sub。那么您可以删除受骗用户,因为他们不再有任何“子”订阅。
  • @MarcB 我可能在您插入时进行了编辑,所以您可能错过了这一点,这有点复杂,因为可能需要手动更新 100 多个表在这种情况下。这就是我尽可能避免的。
  • 去掉唯一索引,然后呢?如果只是在进行修复时。剥离索引,更新用户表并允许级联发挥作用,删除现在重复的用户 ID,重新应用唯一索引。
  • @MarcB 你不能这样做,唯一索引是外键约束要求的兼容性。
  • 那你就完蛋了。您必须手动更新每个子表。

标签: mysql duplicates


【解决方案1】:

所以最后,正如@MarcB 在上面帮助我发现的那样,正确的答案是一开始就计划得更好;)

所以最后,我们将不得不编写一个程序化解决方案来手动加入帐户。我们很幸运能够为每种对象类型提供 DAO/DTO,因此处理引用记录应该不会太糟糕,这将是一项繁重的操作,因此需要一些良好的计划 wink em>。

【讨论】:

    猜你喜欢
    • 2019-12-20
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2015-09-27
    • 2017-02-12
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多