首页 >数据库 >mysql教程 >如何同时将数据插入多个 Postgres 表,同时保持数据完整性?

如何同时将数据插入多个 Postgres 表,同时保持数据完整性?

Susan Sarandon
Susan Sarandon原创
2025-01-12 14:36:41927浏览

How can I insert data into multiple Postgres tables simultaneously while maintaining data integrity?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn