PostgreSQL 中同時在多個資料表插入資料
使用單一查詢向多個表插入資料可以確保資料庫操作的一致性和效率。這可以透過使用資料修改公共表表達式 (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>
每個 INSERT 都依賴先前的 INSERT,確保取得正確的按鍵並在後續插入中使用。
或者,透過提供完整的資料行:
一種更方便的方法是使用 CTE 在一個地方提供完整的資料行:
<code class="language-sql">WITH data(firstname, lastname, adddetails, value) AS ( VALUES ('fai55', 'shaggk', 'ss', 'ss2'), ('fai56', 'XXaggk', 'xx', 'xx2') ) , ins1 AS ( INSERT INTO sample (firstname, lastname) SELECT firstname, lastname FROM data RETURNING firstname, lastname, id AS sample_id ) , ins2 AS ( INSERT INTO sample1 (sample_id, adddetails) SELECT ins1.sample_id, d.adddetails FROM data d JOIN ins1 USING (firstname, lastname) RETURNING sample_id, user_id ) INSERT INTO sample2 (user_id, value) SELECT ins2.user_id, d.value FROM data d JOIN ins1 USING (firstname, lastname) JOIN ins2 USING (sample_id);</code>
這種方法允許插入多行數據,並且它透過為第一次 INSERT 選擇不同的值來處理重複行。
解決並發和唯一約束問題:
為了解決潛在的並發問題並確保資料完整性,可以在sample
表的(firstname, lastname)
列中新增UNIQUE
約束,並且可以在INSERT
查詢中使用ON CONFLICT
子句,如下面的連結參考中所述。
以上是如何同時將資料插入多個 Postgres 表,同時保持資料完整性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!