Maison >base de données >tutoriel mysql >Comment puis-je insérer des données dans plusieurs tables Postgres simultanément tout en préservant l'intégrité des données ?

Comment puis-je insérer des données dans plusieurs tables Postgres simultanément tout en préservant l'intégrité des données ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-12 14:36:41927parcourir

How can I insert data into multiple Postgres tables simultaneously while maintaining data integrity?

Insérer des données dans plusieurs tables simultanément dans PostgreSQL

L'utilisation d'une seule requête pour insérer des données dans plusieurs tables garantit la cohérence et l'efficacité des opérations de base de données. Ceci peut être réalisé en utilisant une expression de table commune de modification des données (CTE), comme indiqué ci-dessous :

Modifier le CTE à l'aide des données :

La requête suivante utilise un CTE de modification de données pour insérer en continu 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>

Chaque INSERT dépend de l'INSERT précédent, garantissant que les clés correctes sont obtenues et utilisées dans les insertions suivantes.

Alternativement, en fournissant la ligne complète de données :

Un moyen plus pratique consiste à utiliser CTE pour fournir la ligne complète de données en un seul endroit :

<code class="language-sql">WITH data(firstname, lastname, adddetails, value) AS (
   VALUES                               
      ('fai55', 'shaggk', 'ss', 'ss2'),  
      ('fai56', 'XXaggk', 'xx', 'xx2')       
   )
, ins1 AS (
   INSERT INTO sample (firstname, lastname)
   SELECT firstname, lastname FROM data
   RETURNING firstname, lastname, id AS sample_id
   )
, ins2 AS (
   INSERT INTO sample1 (sample_id, adddetails)
   SELECT ins1.sample_id, d.adddetails
   FROM   data d
   JOIN   ins1 USING (firstname, lastname)
   RETURNING sample_id, user_id
   )
INSERT INTO sample2 (user_id, value)
SELECT ins2.user_id, d.value
FROM   data d
JOIN   ins1 USING (firstname, lastname)
JOIN   ins2 USING (sample_id);</code>

Cette méthode permet d'insérer plusieurs lignes de données et gère les lignes en double en sélectionnant une valeur différente pour le premier INSERT.

Résoudre les problèmes de concurrence et de contraintes uniques :

Pour résoudre les problèmes de concurrence potentiels et garantir l'intégrité des données, vous pouvez ajouter des contraintes sample dans les colonnes (firstname, lastname) de la table UNIQUE, et vous pouvez utiliser la clause INSERT dans la requête ON CONFLICT, comme ci-dessous comme décrit dans la référence liée.

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