2016-12-01 62 views
0

我重構了一些代碼,這是一個PHP-MYSQL項目。所以我試圖在單個查詢中更新一些表,或者至少兩個。使用大小寫和子查詢更新多個表MySql

這是可能實現不加入?什麼是最好的選擇?

UPDATE document D SET D.status = 2, 
    CASE 
     WHEN D.type 'A' THEN (UPDATE table_1 SET active = 1 WHERE id_table1 = D.id_document) 
     WHEN D.type 'B' THEN (UPDATE table_2 SET active = 1 WHERE id_table2 = D.id_document) 
     WHEN D.type 'C' THEN (UPDATE table_3 SET active = 1 WHERE id_table3 = D.id_document)    
    END 
WHERE D.id_document = %s 

我不介意到第一臺「文件d」分開,但我需要「情況下,當」更新單個查詢多個表,因爲它們就像11個表。

回答

0

不離開回答此問題。基於我研究的內容。

  • 不,您不能在子查詢中執行「更新」。
  • 不,你不能使用這樣的「案例」。

是可以做的唯一事情是:

使用加入更新多個表

UPDATE table_1 
INNER JOIN table_2 ON table_1.id = table_2.id 
INNER JOIN table_3 ON table_3.id = table_3.id 
SET table_1.column = '', table_2.column = '' 
WHERE any condition; 

而且「情況」只能在一個單一的方式

UPDATE table SET 
column = CASE columX WHEN 'A' THEN '2' ELSE column END, 
column2 = CASE columX WHEN 'B' THEN '2' ELSE column2 END 
使用

結合這兩者,我能夠實現我所需要的。

記住,你可以讓不同類型的加盟,並與「裏」玩。在「case」子句中,更新列是強制性的,而不是可選的,所以當我不需要更新該列時,我使用「else」中的同一列將其保留爲默認值。

0

你試圖把它們都放在一個查詢以提高性能?這在這種情況下無濟於事,因爲如果每個子查詢分別執行,它將花費相同的時間。

,如果你在你的PHP代碼確定表名稱,然後通過你會得到更清潔的代碼和更好的性能是上一個更簡單的查詢字符串。

+0

這舊的代碼有這麼多的「mysqli_query()」調用,就像32只是簡單的重複更新。只是想減少線路的數量。此外,我使用簡單的SQL快速複製/粘貼來做測試。 我可以把表放在一個數組中並構建並執行。我試圖避免建立與PHP的SQL –

+0

對不起,有沒有辦法做到這一點與MySQL中的一個查詢。到目前爲止,最乾淨的代碼解決方案是從變量中傳遞表名。更好的辦法是糾正糟糕的數據庫模式設計,並使所有這些表成爲一張表,這樣一次簡單的更新就可以完成這項工作。但既然你說這是舊代碼,在這種情況下很可能是不切實際的。 –

+0

它可能存在「選擇更新」?更多更多的子查詢?不需要在一個查詢中。其他表格「table1,table2」等等,真的不同,不能合併。就像一個用於收款,其他用於付款,其他用於發票等,只在他們之間共享一個列名。 –