利用Postgres CTE順序插入多個表中的資料
在Postgres中,可以使用資料修改公共表表達式(CTE)透過單一查詢將資料插入多個表。 CTE提供了一種方便的方法來定義臨時結果集並在單一查詢中操作資料。
使用資料修改CTE
以下查詢示範如何使用CTE順序地將資料插入三個表:
<code class="language-sql">WITH ins1 AS ( INSERT INTO sample(firstname, lastname) VALUES ('fai55', 'shaggk') RETURNING id AS sample_id ), ins2 AS ( INSERT INTO sample1 (sample_id, adddetails) SELECT sample_id, 'ss' FROM ins1 RETURNING user_id ) INSERT INTO sample2 (user_id, value) SELECT user_id, 'ss2' FROM ins2;</code>
在這個查詢中:
ins1
,將一行插入到sample
表中,並將插入行的ID作為sample_id
傳回。 ins2
,使用ins1
傳回的sample_id
將一行插入sample1
表中。它傳回插入行的user_id
。 INSERT
語句使用ins2
傳回的user_id
將一行插入sample2
表中。 這種方法允許您連結多個INSERT
語句並重複使用先前插入傳回的值。
處理並發寫入
如果多個會話同時插入數據,則必須考慮並發寫入的可能性。為此,您可以使用ON CONFLICT
子句來指定嘗試插入重複記錄時的行為。
使用臨時表的替代方法
作為使用CTE的替代方法,您還可以建立一個臨時表來保存中間數據,然後順序執行插入操作:
<code class="language-sql">CREATE TEMP TABLE tmp AS SELECT * FROM sample; INSERT INTO sample1 (sample_id, adddetails) SELECT id, 'ss' FROM tmp; INSERT INTO sample2 (user_id, value) SELECT user_id, 'ss2' FROM tmp; DROP TABLE tmp;</code>
這種方法涉及使用臨時表作為後續插入的資料來源,而無需直接連結CTE。
透過使用資料修改CTE或臨時表,您可以有效地透過單一Postgres查詢將資料插入多個表,從而簡化資料插入操作。
以上是如何使用 CTE 或臨時表將資料順序插入多個 Postgres 表中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!