You can‘t specify target table ‘student‘ for update in FROM clause

Posted 赵晓东-Nastu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了You can‘t specify target table ‘student‘ for update in FROM clause相关的知识,希望对你有一定的参考价值。

业务需求

编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+
Id 是这个表的主键。

例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+

思路

我们可以先分组然后找到最小的id,然后not in选取没有最小值的时候即可。

DELETE from Person 
Where Id not in (
   
    Select MIN(Id) as id
    From Person 
    Group by Email
  
)

如果我们写成这样,会报
You can’t specify target table ‘Person’ for update in FROM clause

这个是因为当一个请求在读数据时,其他请求也可以读,但是不能写,因为一旦另外一个线程写了数据,就会导致当前线程读取到的数据不是最新的了,这就是不可重复读现象。可以通过使用生成临时表的形式来绕过这种限制,因为mysql只会把这个表当做一个临时表来处理。

正确的写法

# Write your MySQL query statement below
DELETE from Person 
Where Id not in (
    Select Id 
    From(
    Select MIN(Id) as id
    From Person 
    Group by Email
   ) t
)

以上是关于You can‘t specify target table ‘student‘ for update in FROM clause的主要内容,如果未能解决你的问题,请参考以下文章

mysql中You can't specify target table for update in FROM clause

You can‘t specify target table ‘student‘ for update in FROM clause

You can‘t specify target table ‘student‘ for update in FROM clause

You can't specify target table 'xxx' for update in FROM clause

You can't specify target table 'table' for update in FROM clause

mysql You can't specify target table for update in FROM clause解决方法