Verwenden Sie datenmodifizierende CTEs :
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;
Jeder INSERThängt von dem vorhergehenden ab. SELECTanstatt VALUESsicherzustellen, dass nichts in Nebentabellen eingefügt wird, wenn keine Zeile von einer vorherigen zurückgegeben wird INSERT. (Seit Postgres 9.5+ können Sie eine hinzufügen ON CONFLICT.) Auf
diese Weise ist es auch etwas kürzer und schneller.
In der Regel ist es bequemer , vollständige Datenzeilen an einem Ort bereitzustellen :
WITH data(firstname, lastname, adddetails, value) AS (
VALUES
('fai55', 'shaggk', 'ss', 'ss2')
, ('fai56', 'XXaggk', 'xx', 'xx2')
)
, ins1 AS (
INSERT INTO sample (firstname, lastname)
SELECT firstname, lastname
FROM data
RETURNING firstname, lastname, id AS sample_id
)
, ins2 AS (
INSERT INTO sample1 (sample_id, adddetails)
SELECT ins1.sample_id, d.adddetails
FROM data d
JOIN ins1 USING (firstname, lastname)
RETURNING sample_id, user_id
)
INSERT INTO sample2 (user_id, value)
SELECT ins2.user_id, d.value
FROM data d
JOIN ins1 USING (firstname, lastname)
JOIN ins2 USING (sample_id);
db <> hier fummeln
Möglicherweise benötigen Sie explizite Typumwandlungen in einem eigenständigen VALUESAusdruck - im Gegensatz zu einem VALUESAusdruck, der an einen Ort angehängt ist, an INSERTdem Datentypen aus der Zieltabelle abgeleitet werden. Sehen:
Wenn mehrere Zeilen mit identischen kommen können (firstname, lastname) sein können, müssen Sie möglicherweise zuerst Duplikate falten INSERT:
...
INSERT INTO sample (firstname, lastname)
SELECT DISTINCT firstname, lastname FROM data
...
Sie können anstelle des CTE eine (temporäre) Tabelle als Datenquelle verwenden data.
Es wäre wahrscheinlich sinnvoll, dies mit einer EINZIGARTIGEN Einschränkung zu kombinieren (firstname, lastname) in der Tabelle und einer ON CONFLICTKlausel in der Abfrage .
Verbunden: