2011-08-15 25 views
0

我在ubuntu 12.10和MySQL Workbench上使用MySQL 5.1.41。MySQL更新連接不按預期工作

我有2個產品表,T1和T2。 t1是實時數據,t2是導入的數據,可以更新到t1以更新所有新產品的價格。所以我運行:

SELECT * FROM t1 
JOIN t2 ON t1.id = t2.id 
WHERE t1.price != t2.price; 

這將返回1201個記錄,其中價格是不同的,需要更新。所以,我跑:

UPDATE t1 JOIN t2 ON t1.id = t2.id 
SET t1.price = t2.price 
WHERE t1.price != t2.price; 

此完成,沒有錯誤和報告1143行(S)的影響,行匹配:1143更改:1143警告:0

所以已經在這裏的東西是不正確的。選擇查詢中的1201個記錄不同,但只有1143個記錄使用相同的連接和條件進行了更改?

運行初始選擇查詢我希望看到58點的記錄仍然有不同的價格。但是在運行時我得到了和我最初一樣的1201。就好像更新沒有被提交。

任何想法?

+0

兩個表entrie具有相同的ID – sll

+0

都是't1.price'和'同一類型的t2.price'列 – nobody

+0

什麼sllev手段(我認爲)是:?是這兩個表中的'id'主鍵?如果不是,那就是原因。 –

回答

5

您的SELECT顯示的數字(1201)不是t1的記錄,而是來自兩個表的JOIN的記錄。如果兩個id不是UNIQUEPRIMARY KEY s,那麼這是預期的。某些行t1t2中的多行匹配。但是,當UPDATE完成他們只更新一次(這是MySQL的「功能」或UPDATE「錯誤」,一個update語句中檢查順序WHERE條件。

試試這個,看看有多少行(的t1)應該更新?

SELECT * FROM t1 
WHERE EXISTS 
     (SELECT * 
     FROM t2 
     WHERE t1.id = t2.id 
      AND t1.price != t2.price 
    ); 
+0

但是'JOIN t2 ON t1.id = t2.id' –

+0

@Tomalak:我認爲儘管被稱爲'id's,其中一個並不是唯一的。有沒有其他可能的解釋? –

+0

我現在看到這兩個都是PK。所以我更加困惑,並且進一步地,顯示了「行匹配:1143已更改:1143」的操作系統細節,但更新似乎沒有提交,這更加令人困惑。 –