Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从mysql中没有pk、id或唯一列的表中删除重复记录_Mysql_Sql Delete_Records - Fatal编程技术网

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

从mysql中没有pk、id或唯一列的表中删除重复记录,mysql,sql-delete,records,Mysql,Sql Delete,Records,我需要从我的一个表中删除所有重复的记录。问题是没有任何id、唯一或键列,因此我无法生成以下内容: 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 因为有些信息总是需要复制,

我需要从我的一个表中删除所有重复的记录。问题是没有任何id、唯一或键列,因此我无法生成以下内容:

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 
因为有些信息总是需要复制,而其他信息则不需要 我不能这样做:

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  |
+----------+----------------------+--------------+-------------+
我不能截断或删除原始表,因为它全天候使用,并且有10000000条记录


请帮助我。

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


对不起,我的英语不好

我会使用子查询。比如:

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;

使用添加唯一索引(表中所有列均为)将消除重复项:

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

注意:在5.5版中(由于快速索引创建的实现中存在缺陷),只有在
更改之前提供此设置,上述设置才有效:


可能是nop的复制品它不起作用。。。该示例适用于具有id列、键列或唯一列之类内容的表。我没有,也不能更改它。必须始终有一个pk。。。。但这一个没有,我不能改变它。。。所以我没有一个正常的方法来删除重复的行。。。这就是我头痛的原因。。。。我可以找到所有的重复记录,有些记录重复了900次,有些记录重复了400次,有些记录只重复了3到2次,但我只需要留下一条,这是不可能的。。。。将始终存在一些信息重复的列,例如,在同一电话号码(房屋)中将有3人。。。。所以我不能使电话号码,地址不能是唯一的,因为如果它是一个建筑物,那里可以居住许多家庭与不同的电话。。。所以他们不能使用它(+1也是我的。.我尝试了你的解决方案,但似乎没有成功。.我喜欢这种方法,尽管@JohnRuddell在SQLFiddle的5.1版中有效,但在5.5版中无效。可能与一些MySQL设置有关。
IGNORE
在5.6版中被弃用,并从5.7版中删除不,如果删除
IGNORE
,重复项将产生错误肯定是错误。请在我的answer中查看链接的sqlfiddle,在那里它可以使用IGNORE。是的,我从来没有使用IGNORE,但我假设它就是这样做的。我喜欢这种方法,因为它非常简单。它没有添加主键,只是索引。这应该是可以接受的答案!如果它使用select distinct,这可以工作,但我不能删除o原始表格……这是一个不错的选择,但我的情况并非如此(@ss4sgoku检查我的编辑…尝试截断,这将完全清空表,但不会删除it@ss4sgoku另外,你不需要使用distinct,因为group by句柄是的,这是一个很好的方法,但我不能截断或删除原始的一行…而且它有10000000行,因此需要很长的时间和处理能力来重新制作等等…这就是为什么我仍然正在寻找一种方法…@ss4sgoku不管你怎么做,如果表很大,这将需要一些时间。顺便说一句,10M行没有那么大。啊,我的错..如果我们将子查询的结果放入某个临时表(使用distinct后)会怎么样,删除所有重复的记录,然后将临时表中的记录添加到原始表中..虽然这看起来并不简单,但这是我唯一能想到的方法。希望看到另一个答案:)这是一个很好的方法…我从来没有尝试过这样的方法,但它可以工作,我创建临时删除所有从原始的重复和插入从临时它是一个很好的解决方案
SET SESSION old_alter_table=1 ;