2010-07-28 59 views
1

我可以用一個查詢更新兩個相同的表嗎?我可以使用一個查詢更新兩個相同的表嗎?MySQL

TABLEA 
_____________________________ 
|  id  | value  | 
|_____________|_____________| 
|  1  |  a  | 
|  2  |  b  | 
|  3  |  c  | 
|  4  |  d  | 
|  5  |  e  |  
|_____________|_____________| 

TABLEB 
_____________________________ 
|  id  | value  | 
|_____________|_____________| 
|  1  |  a  | 
|  2  |  b  | 
|  3  |  c  | 
|  4  |  d  | 
|  5  |  e  |  
|_____________|_____________| 

我想同時更新兩個表(SET value = 'z' WHERE id=3)。 這可能嗎?

-Thanks

+0

你正在使用哪些DBMS? – 2010-07-28 15:31:13

+1

? DB是MySQL,語言是PHP – calumbrodie 2010-07-28 15:37:40

+0

對不起,沒有注意到標題。添加了'mysql'標籤。 – 2010-07-28 15:40:18

回答

1

MySQL的使用下面的語法支持multiple-table updates

CREATE TABLE tablea (id int, value char(1)); 
CREATE TABLE tableb (id int, value char(1)); 

INSERT INTO tablea VALUES (1, 'a'); 
INSERT INTO tablea VALUES (2, 'b'); 
INSERT INTO tablea VALUES (3, 'c'); 
INSERT INTO tablea VALUES (4, 'd'); 
INSERT INTO tablea VALUES (5, 'e'); 

INSERT INTO tableb VALUES (1, 'a'); 
INSERT INTO tableb VALUES (2, 'b'); 
INSERT INTO tableb VALUES (3, 'c'); 
INSERT INTO tableb VALUES (4, 'd'); 
INSERT INTO tableb VALUES (5, 'e'); 

結果:

SELECT * FROM tablea; 
+------+-------+ 
| id | value | 
+------+-------+ 
| 1 | a  | 
| 2 | b  | 
| 3 | z  | 
| 4 | d  | 
| 5 | e  | 
+------+-------+ 
5 rows in set (0.00 sec) 

SELECT * FROM tableb; 
+------+-------+ 
| id | value | 
+------+-------+ 
| 1 | a  | 
| 2 | b  | 
| 3 | z  | 
| 4 | d  | 
| 5 | e  | 
+------+-------+ 
5 rows in set (0.00 sec) 

UPDATE:

如果你不喜歡重複你要設定值的兩倍,您可能需要使用下面的技巧:

UPDATE tablea, tableb, (SELECT 'z' val) d 
SET tablea.value = d.val, tableb.value = d.val 
WHERE (tablea.id = tableb.id) AND (tablea.id = '3'); 
+0

在您的第一個答案後自己到達那裏 - 非常簡單 - 感謝您的快速響應。 – calumbrodie 2010-07-28 15:43:26

+0

只是注意到這不是你誰提供了第一個答案 - 我已經標記你的anser是正確的,因爲你給了第一個完整的解決方案 @frabiacca 感謝您的鏈接 - 我想出了自己與正確的線文檔。我沒有發現MySQL文檔最容易閱讀(糟糕的格式):-) – calumbrodie 2010-07-28 15:45:30

+0

是的,[@frabiacca](http://stackoverflow.com/questions/3354507/can-i-update-two-identical-tables -in-with-one-query-mysql/3354572#3354572)打敗了我44秒......我用另一個解決方案更新了我的答案,作爲「謝謝」接受我的答案:) – 2010-07-28 15:47:21

2

通過讀取mysql的更新的參考,它說:

對於多表語法,在 table_references滿足 條件命名爲每個表更新 更新行。在這種情況下,不能使用ORDER BY和 LIMIT。

UPDATE items,month SET items.price = month.price WHERE items.id = month.id;

UPDATE tablea, tableb 
SET tablea.value = 'z', tableb.value = 'z' 
WHERE (tablea.id = tableb.id) AND (tablea.id = '3'); 

測試案例:

http://dev.mysql.com/doc/refman/5.0/en/update.html

+0

感謝這篇文檔中的代碼片段 - 我無法找到它 – calumbrodie 2010-07-28 15:46:08

2

有可能在對其進行更新同一時間,但沒有一個單一的SQL語句(好吧,這是,但不推薦)。這幾乎是交易的要點:您逐個更新每個表,但這些更改在您提交之前不會生效。對於任何其他用戶,表格同時更新。

如果你在更新都在一條語句,下面的工作可能真正迫切,但是這取決於其ID作爲主鍵表和可能取決於你使用的特定RDBMS:

update (select tablea.id, 
       tablea.value v1, 
       tableb.value v2 
     from tablea 
      join tableb 
      on tablea.id = tableb.id) 
set v1 = 'z' 
where id = 3 
+0

嗨,謝謝你的回答 - 解決方案比提供的查詢更簡單。 我在問題的標題中陳述了MySQL :-) – calumbrodie 2010-07-28 15:41:58

+0

@calumbrodie:我可以發誓我看到了某個地方,但是當我回去檢查時,我沒有一路走到標題處。 – Allan 2010-07-28 15:53:05

1

大多數RDBMS只允許您在一張表上直接插入,更新或刪除。如果你有外鍵和級聯,那麼一些插入和刪除可以在多個表上執行

但是,如果你使用的是關係數據庫,你不應該有兩個需要相同更新的表。一個驅動程序拋出關係數據庫是數據完整性,關係只能以一種方式保存.e/g /在這種情況下,如果id爲3意味着該值爲c(或在一個chnage之後z),則該關係應該只保存在一個地方

+0

我意識到這一點 - 我沒有設計數據庫:-) – calumbrodie 2010-07-28 15:40:53

相關問題