PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL multi INSERT...RETURNING avec plusieurs colonnes

Utiliser des CTE modificateurs de données pour enchaîner vos trois INSERTs. Quelque chose comme ça :

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;
  • Il est généralement préférable d'ajouter une liste de définitions de colonnes pour INSERT s (sauf cas particuliers). Sinon, si la structure de la table change, votre code pourrait se casser de manière surprenante.

  • J'ai omis les colonnes où vous entreriez simplement DEFAULT . Les valeurs par défaut sont insérées automatiquement. Plus court, même résultat.

  • Le RETURNING final et facultatif renvoie le résultat user_id - évidemment d'une séquence ou d'un autre défaut. C'est en fait le user_id de table3 , mais c'est la même chose à moins que vous n'ayez des déclencheurs ou d'autres magies interférant.

En savoir plus sur les CTE de modification de données (alias "inscriptibles") :

  • Les requêtes de type SELECT sont-elles les seuls types pouvant être imbriqués ?