2013-05-16 58 views
-1

我想更新一個表的行與另一個表的內容兩行。有沒有更有效的方法,而不是用2個別名鎖定表(new_data AS x & y)。有沒有更高效的方法這樣做

SET AUTOCOMMIT=0; 

START TRANSACTION; 

LOCK TABLES 
1_products_speech WRITE, 
new_data as x WRITE, 
new_data as y WRITE; 

UPDATE 1_products_speech 
SET 
    v1 = (SELECT 
      data_blob 
     FROM 
      new_data as x 
     WHERE 
      id = 1), 
    v2 = (SELECT 
      data_blob 
     FROM 
      new_data as y 
     WHERE 
      id = 2) 
WHERE 
    fk_products_id = 1890; 

COMMIT; 

UNLOCK TABLES; 
+0

甚至爲什麼甚至別名 – Drew

+0

如果我嘗試在兩個嵌套選擇上使用相同的別名,那麼我得到錯誤代碼:1100.表'x'沒有鎖定LOCK TABLES –

+0

我的意思是,很高興看到波希米亞人在下面寫道,但正如你寫的那樣,如果你根本沒有別名,那麼這些巢穴就會彼此孤立,並且只會對new_data產生一個鎖定? – Drew

回答

1

MySQL支持多表更新語句,所以你可以重新編寫查詢作爲:

UPDATE 1_products_speech 
JOIN new_data x ON id = 1 
JOIN new_data y ON id = 2 
SET 
    v1 = x.data_blob, 
    v2 = y.data_blob 
WHERE fk_products_id = 1890; 

因爲加入到其他表主表中不依賴於一個值,但我懷疑它在性能方面效率更高,但它在編碼方面可能被認爲更有效率。

+0

Theres上面的「FROM」上的語法錯誤 –

+0

對不起 - 我從內存中工作。這應該現在工作。 – Bohemian

相關問題