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

Mysql SQL删除重复项-保留已删除的ID,mysql,sql,database-design,Mysql,Sql,Database Design,我需要在表中查找和删除重复项,同时保留被删除记录的ID记录,并将其添加到“deleted_id”字段中 例如,下面是我目前拥有的一个表的一部分: +--------+-------------------------------------------------------+ | Id | Name | +--------+---------------------------------

我需要在表中查找和删除重复项,同时保留被删除记录的ID记录,并将其添加到“deleted_id”字段中

例如,下面是我目前拥有的一个表的一部分:

+--------+-------------------------------------------------------+
| Id     | Name                                                  |
+--------+-------------------------------------------------------+
|   9627 |  John Smith                                           |
|   9657 |  John Smith                                           |
|  24455 |  John Smith                                           |
|  67435 |  John Smith                                           |
+--------+-------------------------------------------------------+
我希望达到的结果是:

+--------+-----------------------------+-------------------------+
| Id     | Name                        | Deleted_Ids             |
+--------+-----------------------------+-------------------------+
|   9627 |  John Smith                 | 9657,24455,67435        |
+--------+-----------------------------+-------------------------+
我愿意接受任何实际的方法,如果有人能提供解决方案或建议,我将非常感激

谢谢,
Paul

不要对另一列执行此操作-将ID存储为逗号分隔的列表感觉不正确,是吗

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

如果您想这样做,这里有一个简单的方法。
在一次交易中完成所有
如果在
tbl_del
中可能已经有
'John Smith'
条目,您必须检查并
更新
以添加删除的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有一个优点。

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

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
);
您可以在新表中使用自动递增键。 我没有运行这些查询,如果这里有一些错误,请原谅,这只是一个想法。
在这两个表中有一对多的关系在将来是很有用的,而且更容易查询数据

我想到了,如果一个明智的解决方案出现了,我会考虑的。唯一的问题是我处理的是200mm行,而被删除的_id将很少被访问。所以逗号分隔法是存储方面的理想方法。@Paul:这是最好的。你可以用这种方法修改Erwin的事务。存储的差异将是最小的。我不能同意。在纯粹由整数组成的数据库中,2亿行不是这样的问题。特别是如果你不考虑一直访问它们。您应该知道,因为如果第二个表需要占用2亿行,那么主表将占用更多的流量。事实上,如果您使用逗号分隔的值,您将牺牲性能-您将在主表上执行昂贵的selects+更新,而不是在表上执行插入操作,这样就不会出现锁定、重新索引等问题。您需要删除项列表做什么?您是否考虑过使用“逻辑删除”而不是“物理删除”?