假设您需要使用单个查询同时将数据插入三个表。表结构如下:
<code class="language-sql">CREATE TABLE sample ( id bigserial PRIMARY KEY, lastname varchar(20), firstname varchar(20) ); CREATE TABLE sample1( user_id bigserial PRIMARY KEY, sample_id bigint REFERENCES sample, adddetails varchar(20) ); CREATE TABLE sample2( id bigserial PRIMARY KEY, user_id bigint REFERENCES sample1, value varchar(10) );</code>
您需要为每次插入确保主键,然后在后续表中使用它。但是,为每次插入执行单个查询不允许立即重用键值。
为了同时向三个表插入数据,您可以使用数据修改 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>
第一个 CTE,ins1,插入 sample 表并返回生成的键 (sample_id)。然后,ins2 使用来自 ins1 的 sample_id 插入 sample1 并返回 user_id。最后,第三个 INSERT 使用 user_id 插入 sample2。
通常,预先在 CTE 中定义数据行效率更高:
<code class="language-sql">WITH data(firstname, lastname, adddetails, value) AS ( VALUES ('fai55', 'shaggk', 'ss', 'ss2'), ('fai56', 'XXaggk', 'xx', 'xx2') ) ... -- (查询的其余部分保持不变)</code>
请记住,要考虑唯一性约束、类型转换和处理并发写入等因素,以确保数据的完整性。
以上是如何使用单个查询同时将数据插入到三个 Postgres 表中?的详细内容。更多信息请关注PHP中文网其他相关文章!