无法在mysql中指定更新、删除查询的目标表

Posted

技术标签:

【中文标题】无法在mysql中指定更新、删除查询的目标表【英文标题】:Can't specify target table for update, delete query in mysql 【发布时间】:2011-12-26 08:10:04 【问题描述】:

我想在 mysql 中执行看似简单的删除操作,但遇到了一些麻烦。我想这样做:

delete from table where col_name not in (select distinct col_name from table);

此表没有唯一键。当我尝试这个时,我得到了错误:

您不能在 from 子句中指定更新的目标表;错误编号第1093章

mysql社区5.1

有什么方法可以保存此查询的输出 ->

select distinct col_name from table;

进入温度。表并在删除查询中使用它?

【问题讨论】:

是否要删除重复项。正确的?然后你应该添加唯一键。 您的查询没有任何意义,每列值都将在返回的不同“col_name”列表中。 【参考方案1】:

您必须使用别名。

delete from table where col_name not in (select a.col_name from (select distinct col_name from table) a);

它应该可以工作。

编辑:对不起,我误解了这个问题,只关注 SQL 错误。上述请求没有回答删除没有唯一键的重复行的问题。

【讨论】:

我使用了这个确切的语法并且没有错误,但也没有任何内容被删除,即表没有改变并且仍然包含条目。我验证是否存在重复条目:select col_name from table group by col_name having count(*)>1; 检查 select a.col_name from (select distinct col_name from table) a return the line that you want 。编辑:在您的情况下,检查 select a.col_name from (select col_name from table group by col_name with count(*)>1) a return something。如果没有,请检查内部查询。 谢谢,我检查了select a.col_name from (select col_name from table group by col_name having count(*)>1) a,它确实返回了我想删除的行,所以我使用了这个-> delete from table where col_name in (select a.col_name from (select col_name from table group by col_name having count(*)>1) a) 而不是上面的语法,这很有效!我仍然不确定为什么您建议的第一件事不起作用... @jeffery_the_wind 它不起作用,因为首先您选择所有不同的 col_name 然后您说“col_name 不在(...)中”,显然每个 col_name 都将在返回的不同列表中,所以什么都没有已删除。【参考方案2】:

@Molochdaa 接受的答案是错误的

解释。 假设这是桌子

col_name |  value
------------------
east     |  10
west     |  15
east     |  10
west     |  15
north    |  5
east     |  10
north    |  5

select distinct col_name from table_name 给出:

col_name
------------------
east     
west     
north    

现在当你写delete from table where col_name not in ( ... )然后不会返回任何行,因为每一列都在返回的列表中

正确答案是(@jeffery_the_wind 建议)

delete from table where col_name in (
   select a.col_name from (
      select col_name from table group by col_name having count(*)>1
   ) a
)

另一个更简单的答案

delete from table_name
       where rowid not in ( select min(rowid) 
                            from Table_name
                            group by column1..,column2,...column3..)

【讨论】:

以上是关于无法在mysql中指定更新、删除查询的目标表的主要内容,如果未能解决你的问题,请参考以下文章

无法运行查询给出 mySQL 错误 #1093 - 您无法在 FROM 子句中指定目标表“成员”进行更新 [重复]

如何重写此 MySQL 查询,使其不会引发此错误:您无法在 FROM 子句中指定目标表 'crawlLog' 进行更新?

MySQL 无法在 FROM 子句中指定更新的目标表

Mysql 错误:1093 - 无法在 FROM 子句中指定要更新的目标表

MySQL:您不能在 FROM 子句中指定目标表“任务”进行更新

MySQL 无法在 FROM 多个表连接中指定要更新的目标表