根据文档,当与update语句一起使用时,连接的工作方式与在selects中使用时的工作方式相同。
例如,如果我们有这两个表:
mysql> SELECT * FROM orders;
+---------+------------+
| orderid | customerid |
+---------+------------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 1 |
+---------+------------+
mysql> SELECT * FROM customers;
+------------+------------+
| customerid | ordercount |
+------------+------------+
| 1 | 9 |
| 2 | 3 |
| 3 | 8 |
| 4 | 5 |
| 5 | 7 |
+------------+------------+使用以下select语句:
SELECT orders.customerid
FROM orders
JOIN customers ON (customers.customerid = orders.customerid)返回:
+------------+
| customerid |
+------------+
| 1 |
| 1 |
| 2 |
| 3 |
+------------+所以,我期待着下面的声明:
UPDATE orders
JOIN customers ON (customers.customerid = orders.customerid)
SET ordercount = ordercount + 1为了将customer #1 (customerid = 1)的ordercount更新为11,但实际上并非如此,以下是更新后的结果:
mysql> SELECT * FROM customers;
+------------+------------+
| customerid | ordercount |
+------------+------------+
| 1 | 10 |
| 2 | 4 |
| 3 | 9 |
| 4 | 5 |
| 5 | 7 |
+------------+------------+正如您所看到的,它只增加了一次,尽管它在orders表中出现了两次,而且select语句正确地返回了它。
这是MySQL中的一个bug,还是我做错了什么?出于性能原因,我尽量避免使用group by,因此我有兴趣了解发生了什么。
提前感谢
发布于 2009-04-27 11:51:51
可以,MySQL最多更新连接表中的每条记录一次。
我在文档中找不到它,但实践表明是这样的。
我可能会将其作为bug发布,因此他们至少会将其添加到文档中:
CREATE TABLE updater (value INT NOT NULL);
INSERT
INTO updater
VALUES (1);
SELECT *
FROM updater;
value
---
1
UPDATE updater u
JOIN (
SELECT 1 AS newval
UNION ALL
SELECT 2
) q
SET u.value = u.value + newval;
SELECT *
FROM updater;
value
---
2
(expected 4).顺便说一句,在多表UPDATE中,SQL Server的行为是相同的。
您可以使用:
UPDATE orders o
SET ordercount = ordercount +
(
SELECT COUNT(*)
FROM customers c
WHERE c.customerid = o.customerid
)这在性能上是相同的,只要您在customers (customer_id)上有一个索引
https://stackoverflow.com/questions/793162
复制相似问题