2009-04-27 63 views
1

根據文檔,與update語句一起使用時,連接的工作方式與在select中使用的方式相同。MySQL中的更新問題

例如,如果我們有這兩個表:

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 

更新定單計數客戶#1(客戶ID = 1)爲11,但實際上這是不是這樣的,這裏是更新後的結果:

mysql> SELECT * FROM customers; 
+------------+------------+ 
| customerid | ordercount | 
+------------+------------+ 
|   1 |   10 | 
|   2 |   4 | 
|   3 |   9 | 
|   4 |   5 | 
|   5 |   7 | 
+------------+------------+ 

正如你可以看到它是唯一儘管它在訂單表中出現了兩次,儘管select語句正確地返回了它,但仍會增加一次。

這是MySQL中的錯誤還是我做錯了什麼?我試圖避免使用group by來獲得性能方面的原因,因此我很有興趣瞭解發生了什麼。

在此先感謝

+0

索引對性能同樣會不會是這個問題間接地顯示在你的數據庫設計缺陷?也許這對保持訂單計數來說太麻煩了。如果您通過獨立更新調整此類分數,它可能會導致不一致。也許最好是在需要的時候用查詢生成計數。 – markus 2009-04-27 12:09:21

+0

我只使用客戶和訂單示例來演示問題,我不打算以這種方式使用它 – 2009-04-27 12:19:19

回答

2

是,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相同。

您可以使用:

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

這隻要你有customers (customer_id)