Maison >base de données >tutoriel mysql >Comment puis-je insérer séquentiellement des données dans plusieurs tables Postgres à l'aide de CTE ou d'une table temporaire ?

Comment puis-je insérer séquentiellement des données dans plusieurs tables Postgres à l'aide de CTE ou d'une table temporaire ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-12 14:35:47718parcourir

How Can I Sequentially Insert Data into Multiple Postgres Tables Using CTEs or a Temporary Table?

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 :

  • Le premier CTE, ins1, insère une ligne dans la table sample et renvoie l'ID de la ligne insérée sous la forme sample_id.
  • Le deuxième CTE, 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.
  • L'instruction 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn