sql - 删除具有连接到其他表的主键的重复行
问题描述
一个进程导致表中不应该有重复的行。在线删除重复行有几个很好的答案。但是,如果那些具有 ID 主键的重复项都具有与它们相关联的其他表中的数据怎么办?
有没有办法删除第一个表中的所有重复项并将与这些键相关的所有数据迁移到未删除的单个 PK ID?
例如:
TABLE 1
+-------+----------+----------+------------+
| ID(PK)| Model | ItemType | Color |
+-------+----------+----------+------------+
| 1 | 4 | B | Red |
| 2 | 4 | B | Red |
| 3 | 5 | A | Blue |
+-------+----------+----------+------------+
TABLE 2
+-------+----------+---------+
| ID(PK)| OtherID | Type |
+-------+----------+---------+
| 1 | 1 | Type1 |
| 2 | 1 | Type2 |
| 3 | 2 | Type3 |
| 4 | 2 | Type4 |
| 5 | 2 | Type5 |
+-------+----------+---------+
所以理论上我想从TABLE 1中删除ID: 2的条目,然后将TABLE 2中的OtherID字段切换到1。这实际上需要 X 个表。这种特殊情况有 4 个表连接到它的 ID PK。
解决方案
要做到这一点,您希望将所有内容包装在一个事务中,并在定期维护期间执行此操作。其他任何事情都可能使事情像现在这样不一致。
- 确定您将使用哪个“密钥”。
- 更新所有子表以使用新的“键”,其中值是旧的“键”。
- 重复记录上应该没有 FK 依赖,删除它们。
(ItemType,Color)
解决所有歧义后,对(或任何真实列)放置唯一约束。
如果有很多实例,您可能需要编写一个脚本来处理它并使用其中的信息sys.foreign_keys
来sys.foreign_key_columns
确定要更新哪些记录以及以什么顺序更新。
推荐阅读
- rust - 为什么 FlatBufferBuilder 有生命周期?
- vba - 如何在不影响其余文本的情况下将某些文本的样式更改为标题 1 的样式
- ios - 有没有办法使用 SwiftUI 将选项绑定到 Toggle / Slider
- ios - 我如何获得 Charge 以及如何通过令牌 ID 快速收费(IOS)
- java - 无法在三星设备上的 Android Studio 3.4.1 中运行项目
- javascript - 使用表数据自定义 React Antd 表头
- oauth - 个人访问令牌实施
- javascript - MutationObserver 在样式更改时删除 div
- mysql - 多个 SUM MYSQL
- javascript - Apk 文件未使用 androidjs 构建