从表中删除重复的记录没有pk或id或mysql中的唯一列

从表中删除重复的记录没有pk或id或mysql中的唯一列

问题描述:

我需要从我的表中删除所有重复记录问题是没有任何id或唯一或关键列,所以我可以'牛逼做这样的事情:从表中删除重复的记录没有pk或id或mysql中的唯一列

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

,因为它需要一个id列或独特或键列 并且因为这将是总是必要的重复信息,我不能做出

ALTER IGNORE TABLE 'mytable' ADD UNIQUE INDEX

但其他人不要 ,我不能做E本:

DELETE FROM 'table' WHERE 'field' IN (SELECT 'field' FROM 'table' GROUP BY 'field'HAVING (COUNT('field')>1))

,因为它会删除所有的重复也绝不会离开一个 这是我的表


+----------+----------------------+-------------+-------------+ 
| phone | address    | name  | cellphone | 
+----------+----------------------+-------------+-------------+ 
| 2555555 | 1020 PANORAMA  | JUAN CARLOS | 0999999999 | diferent address 
| 2555555 | GABRIEL JOSE 1020 | JUAN CARLOS | 0999999999 | good one 
| 2555555 | GABRIEL JOSE 1020 | JUAN CARLOS | 0999999999 | duplicated 
| 2555555 | C ATARAZANA 1020  | SILVIA  | 0777777777 | another good one 
| 2555555 | C ATARAZANA 1020  | SILVIA  | 0777777777 | another duplicated 
| 2555555 | GABRIEL JOSE 1020 | VIOLETA  | 0888888888 | diferent person 
+----------+----------------------+-------------+-------------+

的一个例子,这是我要离开


+----------+----------------------+--------------+-------------+ 
| phone | address    | name   | cellphone | 
+----------+----------------------+--------------+-------------+ 
| 2555555 | 1020 PANORAMA  | JUAN CARLOS | 0999999999 | 
| 2555555 | GABRIEL JOSE 1020 | JUAN CARLOS | 0999999999 | 
| 2555555 | C ATARAZANA 1020  | SILVIA  | 0777777777 | 
| 2555555 | GABRIEL JOSE 1020 | VIOLETA  | 0888888888 | 
+----------+----------------------+--------------+-------------+
什么

我不能截断或删除原表,因为它的24/7使用,并有10000000条记录....

请帮帮我。

+0

可能重复[删除重复行只留下最早的行?](http://*.com/questions/3671607/remove-duplicate-rows-leaving-oldest-row-only) – 2014-10-12 02:39:11

+0

不行,它不适用于它...该示例适用于具有类似于ID列或键列或独特列矿的表格,但不具有它并且不能更改它 – ss4sgoku 2014-10-12 02:47:05

每个表格总是有一个PK,但是您可以将列组合为一个唯一的ID,因此如果您想要使用整行作为唯一ID,但我不建议使用整行,你应该搜索什么是可以使用PK的最重要的列,当你这样做时,你可以复制数据,如果没有问题,mysql不会复制重复的行。

对不起,因为我的英语不好

+0

必须始终存在PK ...但是这个没有,并且我不能改变它...所以我没有一个正常的方式来删除重复行...这就是我有一个headche ....我可以找到所有重复和一些记录重复900次其他400和其他人只有3或2次,但我需要留下只有一个 – ss4sgoku 2014-10-12 02:56:05

我会使用子查询。例如:

DELETE FROM table1 
WHERE EXISTS (
SELECT field1 
FROM table1 AS subTable1 
WHERE table1.field1 = subTable1.field1 and table1.field2 = subTable1.field2) 

虽然没有尝试过。

+0

毫米,将删除所有重复的记录,留下任何人...... – ss4sgoku 2014-10-12 03:25:45

+0

啊我的坏..如果我们把子查询的结果放入一些临时表(我们使用不同的)后,删除所有重复记录,然后将临时表中的记录添加到原始记录中。尽管这看起来可能并不直接,但是我能想到的唯一方法。希望看到另一个答案:) – 2014-10-12 04:24:56

+0

多数民众赞成在一个很好的....我从来没有尝试类似的东西,但它可以工作,我创建临时删除所有重复从原来的一个,并从临时插入它的一个很好的解决方案 – ss4sgoku 2014-10-12 06:06:40

它很简单只是做一个临时表并删除其他表然后重新创建它

CREATE TEMPORARY TABLE IF NOT EXISTS no_dupes AS 
(SELECT * FROM test GROUP BY phone, address, name, cellphone); 

TRUNCATE table test; 
INSERT INTO test (phone, address, name, cellphone) 
SELECT phone, address, name, cell FROM no_dupes; 

WORKING DEMO

+0

,可以工作如果它使用选择不同,但我不能删除原来的表....它是一个很好的选择,但不是在我的情况.... :( – ss4sgoku 2014-10-12 04:18:21

+0

@ ss4sgoku检查我的编辑...尝试截断它将完全清空表,但不删除它 – 2014-10-12 04:33:21

+0

@ ss4sgoku也不需要清楚,因为组处理 – 2014-10-12 04:46:23

ALTER IGNORE添加唯一索引(与所有列的表将摆脱重复:

ALTER IGNORE TABLE table_name 
    ADD UNIQUE INDEX all_columns_uq 
    (phone, address, name, cellphone) ; 

测试SQL-Fiddle

注:在5.5版本(由于快速索引创建的实现中的错误),上面的,如果你提供ALTER之前,此设置只会工作内容:

SET SESSION old_alter_table=1 ; 
+0

不能做的。 ...总是会存在一些具有重复信息的列,例如在同一个电话号码(房子)中将是3人....所以我不能使唯一的电话号码,地址不能独特,因为如果它的一个那里的建筑可以用不同的手机生活很多家庭...所以他们不能使用.... :( – ss4sgoku 2014-10-12 04:15:28

+0

你读过我的回答吗?你读过我建议的索引吗? – 2014-10-12 11:02:38

+0

+1也是我..我试过了解决方案,但似乎并没有得到它的工作..我喜欢这种方法,虽然[** ATTEMPT **](http://sqlfiddle.com/#!2/dd86a/1) – 2014-10-12 17:34:07