PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL multi INSERT...RETURNING con più colonne

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 risultante user_id - ovviamente da una sequenza o da qualche altro default. In realtà è l'user_id da table3 , 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?