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 ?
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!