有時候,在操作資料列時,從修改過的列中獲取資料會很有用。INSERT
、UPDATE
、DELETE
和 MERGE
命令都有一個可選的 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
的另一個常見用例。
如果您在文件中看到任何不正確、與特定功能的體驗不符或需要進一步澄清的地方,請使用此表單報告文件問題。