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
INSERTs (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
RETURNINGfinal et facultatif renvoie le résultatuser_id- évidemment d'une séquence ou d'un autre défaut. C'est en fait leuser_iddetable3, 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 ?