删除具有blob text / mediumtext mysql的重复行

时间:2013-06-27 18:14:01

标签: php mysql

我看过很多关于使用sql命令删除行的帖子,但我需要过滤掉mediumtext的行。

我不断从解决方案中收到错误Error Code: 1170. BLOB/TEXT column used in key specification without a key length,例如:

ALTER IGNORE TABLE foobar ADD UNIQUE (title, SID)


我的表很简单,我需要检查mytext中的重复项,id是唯一的,它们是AUTO_INCREMENT
作为一个注释,该表有大约一百万行,所有尝试都保持超时。我需要一个能够批量执行操作的解决方案,例如WHERE id>0 AND id<100
此外,我在亚马逊上使用MySQL Workbench RDS

来自这样的表格

+---+-----+-----+------+-------+
|id |fname|lname|mytext|morevar|
|---|-----|-----|------|-------|
| 1 | joe | min | abc  | 123   |
| 2 | joe | min | abc  | 123   |
| 3 | mar | kam | def  | 789   |
| 4 | kel | smi | ghi  | 456   |
+------------------------------+ 

我想最终得到一张像这样的表

+---+-----+-----+------+-------+
|id |fname|lname|mytext|morevar|
|---|-----|-----|------|-------|
| 1 | joe | min | abc  | 123   |
| 3 | mar | kam | def  | 789   |
| 4 | kel | smi | ghi  | 456   |
+------------------------------+    

更新忘记提及amazon RDS使用mysql workbench了 我的表非常大,我从这个sql命令中不断收到错误Error Code: 1205. Lock wait timeout exceeded

DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name

此外,如果其他人遇到MySQL workbench超时的问题,那么修复程序为
Go to Preferences -> SQL Editor and set to a bigger value this parameter: DBMS connection read time out (in seconds)

2 个答案:

答案 0 :(得分:2)

选项#1:删除所有重复记录,只留下其中一个(例如带有max(id)的那个)

DELETE
FROM yourTable
WHERE id NOT IN
(
   SELECT MAX(id)
   FROM yourTable
   GROUP BY mytext
)

您可能更喜欢使用min(id)。

根据所使用的引擎,这将不起作用,并且正如它所做的那样,为您提供Error Code: 1093. You can't specify target table 'yourTable' for update in FROM clause。为什么?因为删除一条记录可能会导致某些事情发生,使WHERE条件为FALSE,即max(id)会更改该值。

在这种情况下,您可以尝试将另一个子查询用作临时表:

DELETE
FROM yourTable
WHERE id NOT IN
(
    SELECT MAXID FROM
    (
        SELECT MAX(id) as MAXID
        FROM yourTable
        GROUP BY mytext
    ) as temp_table
)

选项#2:使用this示例中的临时表或:

首先,创建一个包含max ids的临时表:

   SELECT MAX(id) AS MAXID
   INTO tmpTable
   FROM yourTable
   GROUP BY mytext;

然后执行删除:

DELETE
FROM yourTable
WHERE id NOT IN
(
    SELECT MAXID FROM tmpTable
);

答案 1 :(得分:0)

如何删除表中的所有重复记录

 DELETE t1 FROM foobar t1 , foobar t2 WHERE  t1 .mytext= t2.mytext