从表中删除重复的记录没有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条记录....
请帮帮我。
每个表格总是有一个PK,但是您可以将列组合为一个唯一的ID,因此如果您想要使用整行作为唯一ID,但我不建议使用整行,你应该搜索什么是可以使用PK的最重要的列,当你这样做时,你可以复制数据,如果没有问题,mysql不会复制重复的行。
对不起,因为我的英语不好
必须始终存在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)
虽然没有尝试过。
它很简单只是做一个临时表并删除其他表然后重新创建它
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;
,可以工作如果它使用选择不同,但我不能删除原来的表....它是一个很好的选择,但不是在我的情况.... :( – ss4sgoku 2014-10-12 04:18:21
@ ss4sgoku检查我的编辑...尝试截断它将完全清空表,但不删除它 – 2014-10-12 04:33:21
@ 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 ;
不能做的。 ...总是会存在一些具有重复信息的列,例如在同一个电话号码(房子)中将是3人....所以我不能使唯一的电话号码,地址不能独特,因为如果它的一个那里的建筑可以用不同的手机生活很多家庭...所以他们不能使用.... :( – ss4sgoku 2014-10-12 04:15:28
你读过我的回答吗?你读过我建议的索引吗? – 2014-10-12 11:02:38
+1也是我..我试过了解决方案,但似乎并没有得到它的工作..我喜欢这种方法,虽然[** ATTEMPT **](http://sqlfiddle.com/#!2/dd86a/1) – 2014-10-12 17:34:07
可能重复[删除重复行只留下最早的行?](http://stackoverflow.com/questions/3671607/remove-duplicate-rows-leaving-oldest-row-only) – 2014-10-12 02:39:11
不行,它不适用于它...该示例适用于具有类似于ID列或键列或独特列矿的表格,但不具有它并且不能更改它 – ss4sgoku 2014-10-12 02:47:05