支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2

6.4. 從修改過的列返回資料 #

有時候,在操作資料列時,從修改過的列中獲取資料會很有用。INSERTUPDATEDELETEMERGE 命令都有一個可選的 RETURNING 子句來支援此功能。使用 RETURNING 可以避免執行額外的資料庫查詢來收集資料,並且在難以可靠地識別修改過的列時尤其有價值。

RETURNING 子句允許的內容與 SELECT 命令的輸出列表相同(請參閱第 7.3 節)。它可以包含命令目標表格的欄位名稱,或使用這些欄位的數值運算式。一個常見的簡寫是 RETURNING *,它按順序選擇目標表格的所有欄位。

INSERT 中,RETURNING 可用的資料是插入的資料列。這在簡單的插入中不是很有用,因為它只會重複客戶端提供的資料。但是,當依靠計算得出的預設值時,它會非常方便。例如,當使用 serial 欄位來提供唯一識別碼時,RETURNING 可以返回分配給新資料列的 ID

CREATE TABLE users (firstname text, lastname text, id serial primary key);

INSERT INTO users (firstname, lastname) VALUES ('Joe', 'Cool') RETURNING id;

RETURNING 子句對於 INSERT ... SELECT 也非常有用。

UPDATE 中,RETURNING 可用的資料是修改後資料列的新內容。 例如

UPDATE products SET price = price * 1.10
  WHERE price <= 99.99
  RETURNING name, price AS new_price;

DELETE 中,RETURNING 可用的資料是已刪除資料列的內容。 例如

DELETE FROM products
  WHERE obsoletion_date = 'today'
  RETURNING *;

MERGE 中,RETURNING 可用的資料是來源資料列的內容加上插入、更新或刪除的目標資料列的內容。由於來源和目標通常具有許多相同的欄位,因此指定 RETURNING * 可能會導致大量重複的欄位,因此限定它以便僅返回來源或目標資料列通常更有用。 例如

MERGE INTO products p USING new_products n ON p.product_no = n.product_no
  WHEN NOT MATCHED THEN INSERT VALUES (n.product_no, n.name, n.price)
  WHEN MATCHED THEN UPDATE SET name = n.name, price = n.price
  RETURNING p.*;

如果目標表格上有觸發器(第 37 章),則 RETURNING 可用的資料是由觸發器修改的資料列。 因此,檢查由觸發器計算的欄位是 RETURNING 的另一個常見用例。

提交更正

如果您在文件中看到任何不正確、與特定功能的體驗不符或需要進一步澄清的地方,請使用此表單報告文件問題。