SQL删除重复项 - 保留已删除的ID

时间:2011-10-27 10:38:50

标签: mysql sql database-design

我需要在表格中查找和删除重复项,同时记录要删除的记录的ID,并将它们添加到“deleted_ids”字段。

例如,这是我目前的一部分表:

+--------+-------------------------------------------------------+
| Id     | Name                                                  |
+--------+-------------------------------------------------------+
|   9627 |  John Smith                                           |
|   9657 |  John Smith                                           |
|  24455 |  John Smith                                           |
|  67435 |  John Smith                                           |
+--------+-------------------------------------------------------+

我想要达到的结果是:

+--------+-----------------------------+-------------------------+
| Id     | Name                        | Deleted_Ids             |
+--------+-----------------------------+-------------------------+
|   9627 |  John Smith                 | 9657,24455,67435        |
+--------+-----------------------------+-------------------------+

我愿意接受任何实际的方法,如果有人能提供解决方案或提出建议,我会非常感激。

谢谢, 保罗

3 个答案:

答案 0 :(得分:4)

不要使用其他列 - 以逗号分隔列表存储ID感觉不对,是吗?

最好的是有一个第二个表有两列PrimaryUserId和DeletedUserId - 例如,PrimaryUserId将是“9627” - 你实际保留的记录之一,你将为从主要删除的每个副本添加一行表。此方法还允许您存储一个知道何时删除重复条目的列。

答案 1 :(得分:2)

如果你想这样做,这是一个简单的方法 在一次交易中完成所有这一切以确保 如果'John Smith'中已有tbl_del条目,则必须检查并UPDATE添加已删除的ID。

BEGIN;

INSERT INTO tbl_del
SELECT name, GROUP_CONCAT(id) AS deleted
FROM   tbl_live
WHERE  name = 'John Smith'
GROUP  BY 1;

DELETE FROM tbl_live
WHERE  name = 'John Smith';

COMMIT;

但我认为Veseliq有一个不起眼的地方。

答案 2 :(得分:1)

基本方法可以是先从旧表中选择所有符合删除条件的行 - > 将这些行插入新表 - > 从旧表中删除所有行

INSERT INTO new_table
SELECT id,name FROM old_table WHERE id > 
(
  SELECT min(id) FROM old_table B
  WHERE A.name = B.name
);

delete FROM old_table WHERE id > 
(
  SELECT min(id) FROM old_table B
  WHERE A.name = B.name
);

您可以在新表中使用自动递增键。 我没有运行这些查询,请原谅我,如果这里有一些错误,那只是为了一个想法。 在这两个表中具有一对多的关系在将来真的很方便....并且更容易查询数据