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