首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL中的更新问题

问MySQL中的更新问题
EN

Stack Overflow用户
提问于 2009-04-27 11:49:42
回答 1查看 148关注 0票数 1

根据文档,当与update语句一起使用时,连接的工作方式与在selects中使用时的工作方式相同。

例如,如果我们有这两个表:

代码语言:javascript
复制
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语句:

代码语言:javascript
复制
SELECT orders.customerid 
FROM orders 
JOIN customers ON (customers.customerid = orders.customerid)

返回:

代码语言:javascript
复制
+------------+
| customerid |
+------------+
|          1 |
|          1 |
|          2 |
|          3 |
+------------+

所以,我期待着下面的声明:

代码语言:javascript
复制
UPDATE orders 
JOIN customers ON (customers.customerid = orders.customerid) 
SET ordercount = ordercount + 1

为了将customer #1 (customerid = 1)的ordercount更新为11,但实际上并非如此,以下是更新后的结果:

代码语言:javascript
复制
mysql> SELECT * FROM customers;
+------------+------------+
| customerid | ordercount |
+------------+------------+
|          1 |         10 |
|          2 |          4 |
|          3 |          9 |
|          4 |          5 |
|          5 |          7 |
+------------+------------+

正如您所看到的,它只增加了一次,尽管它在orders表中出现了两次,而且select语句正确地返回了它。

这是MySQL中的一个bug,还是我做错了什么?出于性能原因,我尽量避免使用group by,因此我有兴趣了解发生了什么。

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-04-27 11:51:51

可以,MySQL最多更新连接表中的每条记录一次。

我在文档中找不到它,但实践表明是这样的。

我可能会将其作为bug发布,因此他们至少会将其添加到文档中:

代码语言:javascript
复制
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的行为是相同的。

您可以使用:

代码语言:javascript
复制
UPDATE  orders o
SET     ordercount = ordercount +
        (
        SELECT  COUNT(*)
        FROM    customers c
        WHERE   c.customerid = o.customerid
        )

这在性能上是相同的,只要您在customers (customer_id)上有一个索引

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/793162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档