【问题标题】:Error involving subquery in SQL UPDATE statementSQL UPDATE 语句中涉及子查询的错误
【发布时间】:2015-07-11 04:18:59
【问题描述】:

我正在尝试更新 MySQL 中特定行的字段值,但我遇到了一个我不太理解的错误。

这里我们有两个表CUSTOMER_TBLORDERS_TBL,我想更新CUSTOMER_TBL,以便用ORD_NUM 下订单的客户的CUST_NAME 等于23E934 是'DAVIDS MARKET'。

这是两张表:

mysql> DESCRIBE CUSTOMER_TBL;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| CUST_ID      | varchar(10) | NO   | PRI | NULL    |       |
| CUST_NAME    | varchar(30) | NO   |     | NULL    |       |
| CUST_ADDRESS | varchar(20) | NO   |     | NULL    |       |
| CUST_CITY    | varchar(15) | NO   |     | NULL    |       |
| CUST_STATE   | char(2)     | NO   |     | NULL    |       |
| CUST_ZIP     | int(5)      | NO   |     | NULL    |       |
| CUST_PHONE   | char(10)    | YES  |     | NULL    |       |
| CUST_FAX     | varchar(10) | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
8 rows in set (0.05 sec)

mysql> DESCRIBE ORDERS_TBL;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| ORD_NUM  | varchar(10) | NO   | PRI | NULL    |       |
| CUST_ID  | varchar(10) | NO   |     | NULL    |       |
| PROD_ID  | varchar(10) | NO   |     | NULL    |       |
| QTY      | int(6)      | NO   |     | NULL    |       |
| ORD_DATE | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.07 sec)

以及给出错误的代码:

mysql> UPDATE CUSTOMER_TBL 
    -> SET CUST_NAME = 'DAVIDS MARKET' 
    -> WHERE CUST_ID = (SELECT C.CUST_ID 
    -> FROM CUSTOMER_TBL C, 
    -> ORDERS_TBL O 
    -> WHERE C.CUST_ID = O.CUST_ID 
    -> AND O.ORD_NUM = '23E934');
ERROR 1093 (HY000): You can't specify target table 'CUSTOMER_TBL' for update in FROM clause

在子查询中引用 CUSTOMER_TBL 有什么问题,我该如何解决这个问题?

谢谢。

【问题讨论】:

标签: mysql sql sql-update subquery


【解决方案1】:

你可能会做这样的事情:

UPDATE CUSTOMER_TBL INNER JOIN ORDERS_TBL 
ON CUSTOMER_TBL.CUST_ID = ORDERS_TBL.CUST_ID 
SET CUSTOMER_TBL.CUST_NAME = 'DAVIDS MARKET' 
WHERE ORDERS_TBL.ORD_NUM = '23E934';

【讨论】:

  • 谢谢,这行得通。不过,这句话对我来说似乎有点奇怪,因为我们告诉 MySQL 我们要更新一个在数据库中并不真正存在的表,而是由其他存在的表组成。 SQL 是如何考虑这个问题的?我们是否允许在更新连接表时对连接中使用的任何表进行更改?
  • 我不确定它在内部是如何工作的,但我认为它会将结果映射到表格并根据你的SET 设置值。不要忘记您必须设置要更新字段的表,例如SET user.id。关于您的第二个问题,是的,您也可以更新表 ORDERS_TBL 中的记录。查看此链接 (dev.mysql.com/doc/refman/5.0/en/update.html) 和此链接 (mysqltutorial.org/mysql-update-join) 了解更多信息和示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
相关资源
最近更新 更多