MySQL 错误您不能在 FROM 子句中指定要更新的目标表

Posted

技术标签:

【中文标题】MySQL 错误您不能在 FROM 子句中指定要更新的目标表【英文标题】:MySQL Error You can't specify target table for update in FROM clause 【发布时间】:2015-09-15 11:34:30 【问题描述】:

我的数据库中有 2 个表 MST_customer 和 TRN_sales 条目已损坏。下一个查询返回损坏的条目:

SELECT TRN_sales.cust_no 
FROM MST_customer 
RIGHT OUTER JOIN TRN_sales 
ON MST_customer.cust_no = TRN_sales.cust_no 
WHERE MST_customer.cust_name IS NULL;

我试图删除它们正在执行:

DELETE FROM mydbB.TRN_sales
WHERE TRN_sales.cust_no IN (
  SELECT TRN_sales.cust_no
  FROM MST_customer
  RIGHT OUTER JOIN TRN_sales
  ON MST_customer.cust_no = TRN_sales.cust_no
  WHERE MST_customer.cust_name IS NULL
);

但我得到下一个错误:

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

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

为了更加“安全”,您应该指定要删除的表(此处为别名s):

DELETE s FROM TRN_sales s
LEFT JOIN MST_customers ON MST.cust_no=TRN.cust_no
WHERE MST.cust_name IS NULL;

我个人认为,这个LEFT JOIN 更容易阅读,当然你也可以用你的RIGHT JOIN 版本做同样的事情。

【讨论】:

@cars10:请您详细说明“delete s”如何比“delete TRN.*”更安全.....是的,左连接更具可读性,但我刚刚处理了 Rin 的查询,以便他感觉很简单,就像他的查询一样...但是如果您使用左连接或右连接,两者都没有问题。 您好 Zafar,您的答案是(并且一直是)100% 正确!当我写我的答案时,我误读了您的TRN.* 指的是整个数据库。情况并非如此,因为您只提到有问题的销售表是完全正确的。因此,从我的角度来看,您的答案仍然是正确的答案,并且应该成为此处首次出现的“选择的答案”。我保留答案的唯一原因是用LEFT JOIN 而不是RIGHT JOIN 显示另一种方法。无论如何,我只是“升级”了你的帖子...... ;-) @cars10: 一点也不,我只是好奇 alias.* 是否有任何重大影响,并且只是在 join 下删除别名。 :)【参考方案2】:

为什么你不试试下面-

DELETE TRN.*
FROM MST_customer MST
RIGHT OUTER JOIN TRN_sales TRN
ON MST.cust_no = TRN.cust_no 
WHERE MST.cust_name IS NULL;

注意:为安全起见,请在执行此查询之前备份两个表。

【讨论】:

您不需要*DELETE TRN FROM ... 也可以。

以上是关于MySQL 错误您不能在 FROM 子句中指定要更新的目标表的主要内容,如果未能解决你的问题,请参考以下文章

mysql - 您不能在 FROM 子句中指定要更新的目标表(我的查询有效,但不是等效更新)

sql mysql错误您无法在FROM子句中指定要更新的目标表

您不能在 FROM 子句中指定要更新的目标表

#1093 - 您不能在 FROM 子句中指定要更新的目标表 [重复]

ERROR 1093 (HY000): 您不能在 FROM 子句中指定要更新的目标表

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