眾所周知,多個伺服器命中會減慢應用程式的速度。出於這個原因,開發人員致力於找尋使用最少陳述式更新資料的最有效方法。事實證明,SQL UPDATE 陳述式確實支援使用以下語法設定多個資料表的欄位:
UPDATE table1, table2, ... SET column1 = value1, column2 = value2, ... [WHERE conditions]
語法是由組合兩個或多個資料表的各種關鍵字組成,例如 join 關鍵字。
今天的文章將概述多資料表 UPDATE 陳述式,以及使用 MySQL 8 和 Navicat Premium 16作為示範例子。
注意事項
將兩個資料表更新組合成一個陳述式並非沒有限制和準則。請記住以下幾點:
- 在多資料表 UPDATE 查詢中,每筆滿足條件的記錄都會被更新。即使記錄多次符合條件,該列也只會更新一次。
- 更新多個資料表的語法不能與 ORDER BY 和 LIMIT 關鍵字一起使用。
因此,雖然多資料表 UPDATE 陳述式非常有效,但它並不適用於所有情況。
實際範例
為了嘗試使用多資料表 UPDATE 陳述式,我們將建立兩個名為「library」和「book」的資料表,並設想一下從圖書館借了一本或多本書。這樣做會同時增加和減少圖書的數量。事實證明,這是將兩個單獨的陳述式組合成一個 UPDATE 查詢的理想方案。這可以避免對伺服器的單獨呼叫,令操作更有效率。
以下是每個資料表的定義和內容:
library 資料表
book 資料表
以下的查詢將更新兩個資料表:
UPDATE library l, book b SET l.book_count = l.book_count - 2, b.book_count = b.book_count + 2 WHERE l.id = b.book_id AND b.id = '1AG';
在上面的查詢中,l.id = b.book_id條件充當一個內部聯結,它將兩個資料表結合在一起,並在檢查資料表條件約束後對組合資料表進行操作。同時,b.id = '1AG' 條件進一步將目標列減少到與使用者 '1AG' 相關的列。
我們也可以使用其他聯結類型,如外部聯結和右方外部聯結;唯一的弱點是分組的兩個資料表必須具有相似或符合的屬性。
與一般(單個資料表)UPDATE 陳述式一樣,SET 關鍵字與 UPDATE 關鍵字會一起用於在現有列中設定新值。舊值會被新資料覆蓋。我們可以在下面的 Navicat 中查看查詢結果:
正如預期的那樣,使用者 '1AG' 和圖書 103 的數量已在兩個資料表中更新:
總結
今天的文章概述了多資料表 UPDATE 陳述式,以及使用了 MySQL 8 和 Navicat Premium 16 作為示範例子。我們學習到多資料表 UPDATE 陳述式最適合對相關資料表欄使用數學運算,例如遞增和遞減。