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