从MySQL中删除重复记录

时间:2012-06-28 16:40:45

标签: mysql

由于我的javascript点击处理存在错误,多个Location对象会发布到发送到服务器的JSON数组中。我想我知道如何解决这个bug,但我也想实现服务器端数据库重复擦除功能。但是,我不确定如何编写此查询。

唯一受影响的表格为

+----+------------+--------+
| ID | locationID | linkID |
+----+------------+--------+
| 64 |         13 |     14 |
| 65 |         14 |     13 |
| 66 |         14 |     15 |
| 67 |         15 |     14 |
| 68 |         15 |     16 |
| 69 |         16 |     17 |
| 70 |         16 |     14 |
| 71 |         17 |     16 |
| 72 |         17 |     16 |
| 73 |         17 |     16 |
| 74 |         17 |     16 |
| 75 |         17 |     16 |
| 76 |         17 |     16 |
| 77 |         17 |     16 |
+----+------------+--------+

如您所见,我有多对(17, 16),而14有两对(14, 13)(14, 15)。如何删除任何重复条目的所有记录?

4 个答案:

答案 0 :(得分:4)

不要实现post factum校正逻辑,在需要唯一的字段上放置一个唯一索引,这样数据库就会在为时已晚之前停止重复插入。

如果您使用的是MySQL 5.1或更高版本,则可以删除欺骗并在1个命令中创建唯一索引:

ALTER IGNORE TABLE 'YOURTABLE' 
ADD UNIQUE INDEX somefancynamefortheindex (locationID, linkID)

答案 1 :(得分:3)

您可以创建一个临时表,您可以在其中存储不同的记录,然后截断原始表并从临时表中插入数据。

CREATE TEMPORARY TABLE temp_table (locationId INT,linkID INT) 

INSERT INTO temp_table (locationId,linkId) SELECT DISTINCT locationId,linkId FROM table1;

DELETE from table1;

INSERT INTO table1 (locationId,linkId) SELECT * FROM temp_table ;

答案 2 :(得分:1)

delete from tbl
using tbl,tbl t2
where tbl.locationID=t2.locationID
  and tbl.linkID=t2.linkID
  and tbl.ID>t2.ID

答案 3 :(得分:0)

我假设你不是要清理,而是为了新的检查?如果可能的话,在可能的情况下放置一个唯一的索引,如果你没有控制DB,请执行upsert并检查空值而不是插入。