0

我已经看到很多关于使用命令删除行的帖子,sql但我需要过滤掉具有mediumtext.

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

ALTER IGNORE TABLE foobar ADD UNIQUE (title, SID)


我的表很简单,我需要检查重复项mytextid是唯一的,它们是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
我的表非常大,我不断收到Error Code: 1205. Lock wait timeout exceeded这个 sql 命令的错误:

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)

4

2 回答 2

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:使用例中的临时表,或者:

首先,创建一个具有最大 id 的临时表:

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

然后执行删除:

DELETE
FROM yourTable
WHERE id NOT IN
(
    SELECT MAXID FROM tmpTable
);
于 2013-06-28T08:57:15.427 回答
0

怎么样,它会从表中删除所有重复的记录

 DELETE t1 FROM foobar t1 , foobar t2 WHERE  t1 .mytext= t2.mytext
于 2013-06-27T18:32:57.167 回答