gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:39:34 25 4
gpt4 key购买 nike

我有一个相当大的 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,并且我删除了一个,那么从属表中的所有行都是已删除。

有什么方法可以解决这些问题?

最佳答案

合并重复用户(或重复任何东西)的问题不是我信任的删除级联和更新级联的问题。首先,当发生冲突时(例如,两个不同的家庭地址,但只允许一个),您如何知道要保留哪些数据?重复数据删除几乎总是最好从为此目的构建的应用程序中手动完成,您可以在其中选择在遇到唯一约束时优先的值。如果您手动执行此操作,则需要确定确定优先级的规则(通常是最近更新的记录,这意味着您必须记录上次更新记录的时间)。您还希望在执行此操作时拥有审计表,这样您就可以撤消事实证明不是一个的“重复项”。

关于sql - 在 InnoDB/MySQL 中使用外键约束和级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4614271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com