我看过很多关于使用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)
答案 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