2009-12-09 42 views
0
UPDATE table1, tmpList 
    SET table1.ts = tmpList.ts_value 
WHERE table1.id = tmpList.id 

UPDATE table2, tmpList 
    SET table2.ts = tmpList.ts_value 
WHERE table2.id = tmpList.id 

我使用MySQL如何在一個語句中更新兩個表?

+0

你是什麼意思的「在一個聲明」? – yoda 2009-12-09 04:15:58

回答

2

假設每個ID出現在兩個表中(最好是隻有一次):

update tmpList inner join table1 using (id) inner join table2 using (id) 
    set table1.ts = tmpList.ts_value, table2.ts=tmpList.ts_value; 

更新:簡單地用左連接,而不是內部連接,使這項工作即使對於只在一個表中的標識 - 不適用的集子句似乎只是被跳過;顯然,我應該早些嘗試過。

+0

這基本上是我想要的,但不知道它是否工作。 – user198729 2009-12-09 04:18:12

+0

是的,它適用於我描述的情況。 – ysth 2009-12-09 04:21:14

+0

如果某個ID沒有出現在兩個表中會怎麼樣?它會損壞表嗎? – user198729 2009-12-09 04:26:20

-2

沒有,如果你使用的是簡單的查詢,這是不可能的。我不熟悉我的SQL,但在oracle中,一次不能更新兩個表。

+1

MySql具有多表更新功能。即將推出到您附近的主要數據庫。很快被5年以上和/或主要版本發佈。 – 2009-12-09 04:28:48

1

爲什麼你需要一個聲明?你擔心一個完成和另一個失敗,留下一半更新的爛攤子?

如果是這樣的話,交易就是你所需要的。例如。

begin work; 

UPDATE table1, tmpList 
    SET table1.ts = tmpList.ts_value 
WHERE table1.id = tmpList.id; 

UPDATE table2, tmpList 
    SET table2.ts = tmpList.ts_value 
WHERE table2.id = tmpList.id; 

commit work; 

您應該可以在單個命令中運行上述所有操作,但如果不能,則可以單獨運行它們。除非提交完成,否則數據將不會永久保存,只有在begin ... commit之間的所有前面的行都成功時纔會發生這種情況。

相關問題