Utilisation de Postgres CTE pour insérer séquentiellement des données dans plusieurs tables
Dans Postgres, vous pouvez utiliser des expressions de table communes de modification de données (CTE) pour insérer des données dans plusieurs tables avec une seule requête. CTE offre un moyen pratique de définir des ensembles de résultats temporaires et de manipuler des données en une seule requête.
Utiliser les données pour modifier le CTE
La requête suivante montre comment utiliser CTE pour insérer séquentiellement des données dans trois tables :
<code class="language-sql">WITH ins1 AS ( INSERT INTO sample(firstname, lastname) VALUES ('fai55', 'shaggk') RETURNING id AS sample_id ), ins2 AS ( INSERT INTO sample1 (sample_id, adddetails) SELECT sample_id, 'ss' FROM ins1 RETURNING user_id ) INSERT INTO sample2 (user_id, value) SELECT user_id, 'ss2' FROM ins2;</code>
Dans cette requête :
ins1
, insère une ligne dans la table sample
et renvoie l'ID de la ligne insérée sous la forme sample_id
. ins2
, utilise le ins1
renvoyé par sample_id
pour insérer une ligne dans la table sample1
. Il renvoie le user_id
de la ligne insérée. INSERT
finale insère une ligne dans la table ins2
en utilisant le user_id
renvoyé par sample2
. Cette approche vous permet d'enchaîner plusieurs INSERT
instructions et de réutiliser les valeurs renvoyées par les insertions précédentes.
Gestion des écritures simultanées
Si plusieurs sessions insèrent des données en même temps, vous devez envisager la possibilité d'écritures simultanées. Pour ce faire, vous pouvez utiliser la clause ON CONFLICT
pour spécifier le comportement lorsque vous essayez d'insérer un enregistrement en double.
Alternatives utilisant des tables temporaires
Au lieu d'utiliser CTE, vous pouvez également créer une table temporaire pour contenir les données intermédiaires, puis effectuer les insertions de manière séquentielle :
<code class="language-sql">CREATE TEMP TABLE tmp AS SELECT * FROM sample; INSERT INTO sample1 (sample_id, adddetails) SELECT id, 'ss' FROM tmp; INSERT INTO sample2 (user_id, value) SELECT user_id, 'ss2' FROM tmp; DROP TABLE tmp;</code>
Cette approche consiste à utiliser une table temporaire comme source de données pour les insertions ultérieures sans lier directement le CTE.
En utilisant un CTE de modification de données ou une table temporaire, vous pouvez insérer efficacement des données dans plusieurs tables avec une seule requête Postgres, simplifiant ainsi les opérations d'insertion de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!