2016-01-29 51 views
4

下面的SELECT查詢和UPDATE查詢具有相同的FROM子句和WHERE子句。因此,我期望SELECT查詢返回與UPDATE查詢匹配並受其影響的相同數量的行,但正如所見,情況並非如此。SQL UPDATE如何比類似的SELECT匹配更多的行?

我不知道是否有關,但更新所看到,我試圖保存記錄的用戶名和電子郵件中的另一列,但最後一個查詢所看到的,我沒有保存電子郵件,只是用戶名。

這是爲什麼?

mysql> SELECT p.old_username, p.username, p.old_email, u.email 
    -> FROM users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
+--------------+------------+-----------+---------------------+ 
| old_username | username | old_email | email    | 
+--------------+------------+-----------+---------------------+ 
| NULL   | myusername | NULL  | [email protected] | 
+--------------+------------+-----------+---------------------+ 
1 row in set (0.00 sec) 

mysql> 
mysql> UPDATE 
    -> users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> SET p.old_username = p.username, p.username = NULL, 
    -> p.old_email = u.email, u.email = NULL, 
    -> e.record_status = 'inactive', e.date_modified = NOW(), e.modified_by_id =506836355 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
Query OK, 3 rows affected (0.00 sec) 
Rows matched: 3 Changed: 3 Warnings: 0 

mysql> 
mysql> SELECT p.old_username, p.username, p.old_email, u.email 
    -> FROM users u INNER JOIN people p ON p.id = u.id INNER JOIN entities e ON e.id = p.id 
    -> WHERE u.id =1753671666 AND u.id !=506836355 AND e.sites_id =2846702735; 
+--------------+----------+-----------+-------+ 
| old_username | username | old_email | email | 
+--------------+----------+-----------+-------+ 
| myusername | NULL  | NULL  | NULL | 
+--------------+----------+-----------+-------+ 
1 row in set (0.00 sec) 

mysql> 
+1

你在那張桌子上有觸發器嗎?也許觸發器正在改變2個額外的行 - 例如在審計表或類似的? –

+0

@RB。好主意。檢查,並沒有觸發器。 – user1032531

+0

MySQL允許在單個語句中更新多個表?我從來不知道! – Brandon

回答

4

SELECT語句報告單個行是連接查詢的結果。

但是要更新表:

p.old_username (and several others) 
e.date_modified (and others) 
u.email 

因此有3次更新。

+0

好吧,也許這就是爲什麼它說'3行受影響'。但是更新也顯示'行匹配:3'。也許我以前從未注意過,但不會期望這樣我會做一些測試。 – user1032531

+0

最簡單的測試可能是跳過其中一個表更新(如u。電子郵件),看看它是否切換到匹配的2行(它幾乎肯定會在2行受到影響,你的觀點)。 –

+0

史蒂夫,我做你的建議的測試,並公佈他們http://stackoverflow.com/questions/35087318/order-of-precedence-of-update-on-multiple-columns。因爲我現在似乎只有2影響上顯示了三個對這個職位查詢行更重要的是奇怪的。我一定要抽菸的東西...... – user1032531

相關問題