Använd datamodifierande CTE för att koppla ihop dina tre INSERT. Något så här:
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 är vanligtvis bäst att lägga till en kolumndefinitionslista för
INSERT
s (förutom i speciella fall). Annars, om tabellstrukturen ändras, kan din kod gå sönder på överraskande sätt. -
Jag utelämnade kolumner där du bara skulle ange
DEFAULT
. Standardinställningarna infogas automatiskt. Kortare, samma resultat. -
Den sista, valfria
RETURNING
returnerar det resulterandeuser_id
- uppenbarligen från en sekvens eller någon annan standard. Det är faktisktuser_id
fråntable3
, men det är detsamma om du inte har några triggers eller annan magi som stör.
Mer om datamodifierande (a.k.a. "skrivbara") CTE:er:
- Är SELECT-frågor den enda typen som kan kapslas?