首页 >数据库 >mysql教程 >如何使用单个查询同时将数据插入到三个 Postgres 表中?

如何使用单个查询同时将数据插入到三个 Postgres 表中?

DDD
DDD原创
2025-01-12 14:38:42417浏览

How Can I Insert Data into Three Postgres Tables Simultaneously Using a Single Query?

使用 Postgres 同时向三个表插入数据

假设您需要使用单个查询同时将数据插入三个表。表结构如下:

<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

为了同时向三个表插入数据,您可以使用数据修改 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中文网其他相关文章!

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