Utilizza CTE di modifica dei dati per concatenare i tuoi tre INSERT. Qualcosa del genere:
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;
-
In genere è meglio aggiungere un elenco di definizioni di colonne per
INSERT
s (salvo casi particolari). Altrimenti, se la struttura della tabella cambia, il tuo codice potrebbe rompersi in modi sorprendenti. -
Ho omesso le colonne in cui avresti semplicemente inserito
DEFAULT
. I valori predefiniti vengono inseriti automaticamente. Più breve, stesso risultato. -
Il
RETURNING
finale e opzionale restituisce il risultanteuser_id
- ovviamente da una sequenza o da qualche altro default. In realtà è l'user_id
datable3
, ma è lo stesso a meno che tu non abbia alcuni trigger o altre magie che interferiscono.
Ulteriori informazioni sui CTE di modifica dei dati (aka "scrivibili"):
- Le query di tipo SELECT sono l'unico tipo che può essere nidificato?