Brug datamodificerende CTE'er for at sammenkæde dine tre INDSÆT. Noget som dette:
WITH ins1 AS (
INSERT INTO table1 (username, name, surname)
VALUES ('johnee','john','smith')
RETURNING user_id
)
, ins2 AS (
INSERT INTO table2 (user_id, password)
SELECT ins1.user_id, 'secret'
FROM ins1 -- nothing to return here
)
INSERT INTO table3 (user_id, adress, city, phone)
SELECT ins1.user_id, ...
FROM ins1
RETURNING user_id;
-
Det er typisk bedst at tilføje en liste over kolonnedefinitioner for
INSERT
s (bortset fra særlige tilfælde). Ellers, hvis tabelstrukturen ændres, kan din kode gå i stykker på overraskende måder. -
Jeg har udeladt kolonner, hvor du bare ville indtaste
DEFAULT
. Standarder indsættes automatisk. Kortere, samme resultat. -
Den sidste, valgfri
RETURNING
returnerer den resulterendeuser_id
- åbenbart fra en sekvens eller en anden standard. Det er faktiskuser_id
fratable3
, men det er det samme, medmindre du har nogle triggere eller anden magi, der forstyrrer.
Mere om datamodificerende (også kaldet "skrivbare") CTE'er:
- Er SELECT-type-forespørgsler den eneste type, der kan indlejres?