Mysql SQL删除重复项-保留已删除的ID
我需要在表中查找和删除重复项,同时保留被删除记录的ID记录,并将其添加到“deleted_id”字段中 例如,下面是我目前拥有的一个表的一部分:Mysql SQL删除重复项-保留已删除的ID,mysql,sql,database-design,Mysql,Sql,Database Design,我需要在表中查找和删除重复项,同时保留被删除记录的ID记录,并将其添加到“deleted_id”字段中 例如,下面是我目前拥有的一个表的一部分: +--------+-------------------------------------------------------+ | Id | Name | +--------+---------------------------------
+--------+-------------------------------------------------------+
| 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+更新,而不是在表上执行插入操作,这样就不会出现锁定、重新索引等问题。您需要删除项列表做什么?您是否考虑过使用“逻辑删除”而不是“物理删除”?