【问题标题】:update & insert in one query (not upsert)在一个查询中更新和插入(不是 upsert)
【发布时间】:2017-10-26 22:41:37
【问题描述】:

我正在使用 PostgreSQL。

我有桌子 A、B、C 和 D。

表 A 有一个指向表 B 的外键(一对多)。

表 C 和 D 具有表 A 的外键(一对多)。 所以它看起来像:

B :-> A :-> C & D

现在我想添加一个中间表 E 来建立关系:

E :-> C & D(一对多)

B -> E(与 fk 一对一)

B :-> A(一对多)

我需要它来引入表 F,它也将具有表 E 的外键。

表 E 只有一个标识列“id”。

现在我必须编写一个迁移,但不知道如何将行添加到 E 并同时更新 B

在伪 SQL 中它必须看起来像:

更新 B SET A_id = id 插入 A (id)

【问题讨论】:

  • 我不清楚你的问题。你只需要交易吗? BEGIN; INSERT...; UPDATE ...; COMMIT;

标签: database postgresql


【解决方案1】:

您可以为此使用WITH 语句:

WITH inserted_rows AS (
    INSERT INTO A(...) VALUES (...) RETURNING *
) UPDATE B SET A_id = a.id FROM inserted_rows a WHERE ...;

WHERE 子句应该过滤B 的匹配行。不幸的是,你的问题非常广泛,所以我不能给你一个更详细的例子。

【讨论】:

    【解决方案2】:

    添加一个临时列对我有帮助。

    CREATE TABLE promo_codes_definitions (
        id              serial      PRIMARY KEY
       ,emission_id     integer     REFERENCES promo_codes_emissions(id)
       ,when_created    timestamp   NOT NULL DEFAULT TIMEZONE('UTC', NOW())
    );
    
    INSERT INTO promo_codes_definitions(emission_id, when_created)
    SELECT pce.id, pce.when_created
    FROM promo_codes_emissions pce;
    
    UPDATE promo_codes_emissions pce
    SET promo_codes_definition_id = pcd.id
    FROM promo_codes_definitions pcd
    WHERE pce.id = pcd.emission_id;
    
    ALTER TABLE promo_codes_definitions
        DROP COLUMN emission_id;
    

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 2014-02-09
      • 2016-04-14
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多