首页 > 解决方案 > 删除具有连接到其他表的主键的重复行

问题描述

一个进程导致表中不应该有重复的行。在线删除重复行有几个很好的答案。但是,如果那些具有 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。

标签: sqlsql-server

解决方案


要做到这一点,您希望将所有内容包装在一个事务中,并在定期维护期间执行此操作。其他任何事情都可能使事情像现在这样不一致。

  1. 确定您将使用哪个“密钥”。
  2. 更新所有子表以使用新的“键”,其中值是旧的“键”。
  3. 重复记录上应该没有 FK 依赖,删除它们。
  4. (ItemType,Color)解决所有歧义后,对(或任何真实列)放置唯一约束。

如果有很多实例,您可能需要编写一个脚本来处理它并使用其中的信息sys.foreign_keyssys.foreign_key_columns确定要更新哪些记录以及以什么顺序更新。


推荐阅读