繁体   English   中英

在InnoDB / MySQL中使用外键约束和级联

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM