【发布时间】:2015-07-11 04:18:59
【问题描述】:
我正在尝试更新 MySQL 中特定行的字段值,但我遇到了一个我不太理解的错误。
这里我们有两个表CUSTOMER_TBL 和ORDERS_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 有什么问题,我该如何解决这个问题?
谢谢。
【问题讨论】:
-
您正在尝试更新一个表,并且您正在子查询中使用该表。您正在尝试从正在更新的表中进行选择,这是不可能的。这就是你得到的错误。检查如何使用 JOIN 更新查询:stackoverflow.com/questions/982919/sql-update-query-using-joins
-
@Mindastic:我不明白链接与 OP 问题的相关性。这是一个 SQL Server 帖子。否则,您在评论中的解释是正确的。
-
@sstan:因为他可能可以使用 JOINS 来执行他想要的查询。
标签: mysql sql sql-update subquery