Navicat 部落格

一個陳述式更新多個資料表 2022 年 11 月 17 日,由 Robert Gravelle 撰寫

眾所周知,多個伺服器命中會減慢應用程式的速度。出於這個原因,開發人員致力於找尋使用最少陳述式更新資料的最有效方法。事實證明,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 資料表

library_table_definition (32K)

library_table_contents (18K)

book 資料表

book_table_definition (38K)

book_table_contents (17K)

以下的查詢將更新兩個資料表:

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 中查看查詢結果:

update_result (44K)

正如預期的那樣,使用者 '1AG' 和圖書 103 的數量已在兩個資料表中更新:

updated_table_contents (27K)

總結

今天的文章概述了多資料表 UPDATE 陳述式,以及使用了 MySQL 8 和 Navicat Premium 16 作為示範例子。我們學習到多資料表 UPDATE 陳述式最適合對相關資料表欄使用數學運算,例如遞增和遞減。

Navicat 文章
頻道記錄
分享
部落格封存檔