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ésultatuser_id
- évidemment d'une séquence ou d'un autre défaut. C'est en fait leuser_id
detable3
, 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 ?