[英]Working with foreign key contraints and cascades in InnoDB/MySQL
我有一个相当大的InnoDB / MySQL关系数据库。 我到处都使用了外键约束,并加上了“ ON UPDATE CASCADE”(和“ ON DELETE CASCADE”)。
该数据库是CRM系统的一部分,因此包含用户,然后将帐户附加到这些用户。
通常,我们发现用户表中存在重复的条目,我们希望将它们合并。
一种选择是编写一个遍历数据库的脚本,以更新所有相关表中的user_id列。 但这无疑会在每次数据库结构更改时中断。
我要探讨的另一个选项是使用CASCADE。 如果要合并人A和人B,则可以执行以下操作:
UPDATE user SET id = $A.id$ WHERE id = $B.id$ limit 1
然后,此更改应传播到所有依赖于用户表的表中。
然后,我必须从用户中删除重复的行之一:
DELETE FROM user WHERE id = $A.id$ LIMIT 1
不幸的是,这种方法存在两个问题。
首先, user.id
列是主键,因此是唯一的。
其次(假设我已经将user.id
从PRIMARY KEY转换为常规INDEX),如果用户中有重复的ID,并且我删除了一个,则从相关表中删除所有行。
有办法解决这些问题吗?
在删除级联和更新级联上,我不希望合并重复用户(或重复任何内容)的问题。 首先,您如何知道发生冲突时要保留哪些数据(例如两个不同的家庭地址,并且只允许一个)? 在为此目的而构建的应用程序中,手动进行几乎最好的重复数据删除操作,在该应用程序中,您可以选择遇到唯一约束时优先使用的值。 如果手动进行,则需要确定确定优先级的规则(通常是最近更新的记录,这意味着您必须记录上次更新记录的时间)。 您还希望在执行此操作时具有审核表,因此可以撤消原来不是一个的“重复项”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.