2017-10-26 2 views
1

私はPostgreSQLを使用しています。1つのクエリで更新と挿入を行います(アップではありません)

は、I Aは、B、C & D.

表A、表Bへの外部キーを持つテーブルを持っている(そう一対多)。

表C & Dには表Aへの外部キー(1対多)があります。 ようなので、それが見えます:

B: - > A: - > C & D

今私は関係を作るために中間テーブルEを追加したい:

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

B - > E(一対一FK有する)

B - > A(1対多)

IテーブルFにテーブルEへの外部キーも持たせる必要があります。

テーブルEにはIDカラムが1つだけあります。

は、今私は、移行を記述する必要があり、どのようにEに行を追加すると、更新を同時に

B疑似SQLでは、それがどのように見えるしなければならない見当がつかない:

UPDATEのB SET A_ID = ID

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

: INSERT INTO A(ID)

+0

私はあなたの質問には不明です。あなたは取引が必要ですか? 'BEGIN;インサート...;更新...; COMMIT; ' – hunteke

答えて

1

あなたはそのためのWITHステートメントを使用することができますWHERE句は、Bの一致する行をフィルタリングする必要があります。残念ながら、あなたの質問は非常に広いので、私はあなたにもっと詳細な例を与えることはできません。

-1

一時的な列を追加すると私に役立ちます。

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; 
関連する問題