【发布时间】: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