【问题标题】:Insert data into two dependent tables from another table将数据从另一个表插入到两个从属表中
【发布时间】:2020-05-25 01:47:18
【问题描述】:

在 Postgresql (11) 中,我有一个表 pre_data,其中包含 3 个字段:id_bdata_adata_b

我想将此表中的INSERT 语句执行到另外两个a (id_a, data_a)b (id_b, id_a, data_b) 中,其中b.id_a 有一个引用a.id_a 的外键约束。两个表都应填充来自pre_data 的数据。因此需要先填充表a,否则将没有可用于表b 的键id_a

如果这样的查询是可能的,那就太好了:

WITH first AS (
    INSERT INTO a (id_a, data_a)
    SELECT t.data_a FROM pre_data t
    RETURNING id_a, t.id_b, t.data_b
)
INSERT INTO b (id_a, id_b, data_b)
SELECT id_a, id_b, data_b FROM first

但我知道它不会起作用,因为RETURNING 语句只能引用正在插入的表中的列 (a)。

如果我执行两个单独的查询,我无法将插入到 a 中的数据与原始 pre_data 连接回来(data_adata_b 不是唯一字段)。

我希望有一种方法可以在没有临时表的情况下做到这一点,因为实际的表非常大。

【问题讨论】:

  • 您的示例没有说服力,因为您没有将a 中的任何列插入b。您可以直接从pre_data 进行第二次插入。
  • 你是对的,我错过了插入中的一列。我会更新问题

标签: sql postgresql


【解决方案1】:

如果有人遇到类似问题,我最终通过从序列中预生成 id_a 值来解决这个问题:

WITH first AS (
    SELECT
        nextval('seq_id_a') AS id_a,
        t.id_b, t.data_a, t.data_b
    FROM pre_data t
), insert_a AS (
    INSERT INTO a (id_a, data_a)
    SELECT id_a, data_a
    FROM first
    RETURNING id_a
)
INSERT INTO b (id_b, id_a, data_b)
SELECT id_b, id_a, data_b
FROM insert_a a INNER JOIN first t USING (id_a)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多