SQLite擴展UPDATE敘述句功能,從8月14日釋出的SQLite 3.33開始支援UPDATE-FROM子句,也就是說,現在表格更新敘述可以由資料庫中的其他表格驅動,開發者可以結合目標資料表和其他資料表,以計算出需要更新的資料列以及值。官方提到,不少資料庫引擎都有支援UPDATE-FROM,但是因為SQLite力求與PostgreSQL相容,因此實際上UPDATE-FROM的運作方式,與SQL Server和MySQL有所不同。

當更新資料來自於其他表格的使用案例,UPDATE-FROM便可派上用場,像是可用在銷售點應用程式,銷售點應用程式會在銷售表格中累計銷售量,當每日營業結束要結算時,應用程式便會根據每日銷售調整庫存,因此開發者現在就能夠使用UPDATE-FROM子句,在庫存資料表中執行UPDATE,而庫存的更資料來自於當日的銷售數量。

寫作:
UPDATE inventory
   SET quantity = quantity - daily.amt
   FROM (SELECT sum(quantity) AS amt, itemId FROM sales GROUP BY 2) AS daily
   WHERE inventory.itemId = daily.itemId;
 
FROM子句查詢會計算每個itemId應該減少的庫存量,該子句是以庫存表格和每一個受影響的庫存數量進行連接(Join),目的是要正確地調整庫存,官方提到,更新目標表格不被包含在FROM子句中,當要對目標表格進行自連接(Self-Join),則FROM子句中的表格必須要使用不同於目標表格名稱的別名。

而當目標表格和FROM子句之間的連接,對相同目標表格列輸出多資料列,那麼這些多輸出列僅會有一列被用來更新目標資料表,官方提到,輸出列的選擇是隨機的,可能根據SQLite版本不同而不同,甚至可能每次執行都不同。

官方也解析了SQLite的UPDATE-FROM功能與其他資料庫引擎不同之處,除了SQLite,SQL Server和MySQL也都有支援UPDATE-FROM的概念。在SQL Server中,目標表格被包含在FROM子句中,目標表格會在敘述句中被命名兩次;而MySQL的UPDATE-FROM不像其他系統僅只有一個目標表格,因此可以在SET子句修改連接任何表格,並且還可以一次更新多個表格。

熱門新聞

Advertisement