Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中的更新问题_Sql_Mysql - Fatal编程技术网

MySQL中的更新问题

MySQL中的更新问题,sql,mysql,Sql,Mysql,根据文档,当与update语句一起使用时,联接的工作方式与在selects中使用时相同 例如,如果我们有这两个表: mysql> SELECT * FROM orders; +---------+------------+ | orderid | customerid | +---------+------------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | | 4

根据文档,当与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中的错误还是我做错了什么?出于性能方面的原因,我尽量避免使用group by,因此我有兴趣了解正在发生的事情


提前感谢

是的,
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).
顺便说一下,SQL Server在多表更新中的行为是相同的

您可以使用:

UPDATE  orders o
SET     ordercount = ordercount +
        (
        SELECT  COUNT(*)
        FROM    customers c
        WHERE   c.customerid = o.customerid
        )

只要你在
客户(客户id)

上有一个索引,这在性能上是相同的,那么,这是设计的吗?文档中没有提到这一点很抱歉在问题中没有提到这一点,但实际上我在join语句中有更多的条件,为了使事情更简单,我删除了这些条件。。您答案中的这段代码将更新整个表,这不是我想要的,客户可以有大量记录(顺便说一句,这不是一个客户表,仅用于演示问题),连接结果只有几条记录需要更新感谢您的详细答案。。实际上,我只使用订单中的一些记录(使用一些条件)来更新customers表。。似乎使用GROUP BY是唯一的方法,这个问题会间接地显示数据库设计中的缺陷吗?也许要记录订单数量太麻烦了。如果您通过独立更新调整此类分数,则可能导致ot不一致。当你需要的时候,也许用一个查询来生成这个计数会更好。我只使用了customers and orders示例来演示这个问题,我不打算这样使用它