Maison > base de données > tutoriel mysql > Comment gérer les insertions groupées imbriquées avec des contraintes de clé étrangère ?

Comment gérer les insertions groupées imbriquées avec des contraintes de clé étrangère ?

Barbara Streisand
Libérer: 2025-01-13 07:42:43
original
242 Les gens l'ont consulté

How to Handle Nested Bulk Inserts with Foreign Key Constraints?

L'un des défis liés aux insertions par lots imbriqués est l'ordre d'insertion. Supposons que vous créiez des tables parent et enfant en utilisant des références de clé étrangère entre elles. Un enregistrement parent doit généralement exister avant qu'un enregistrement enfant puisse être inséré. Pour résoudre ce problème, l'enregistrement parent doit être inséré en premier, puis l'enregistrement enfant.

Le problème est que vous ne pouvez pas insérer un enregistrement enfant tant que l'ID de l'enregistrement parent n'est pas disponible. Une façon de résoudre ce problème consiste à utiliser une procédure stockée pour insérer des enregistrements. Une procédure stockée peut d'abord insérer des enregistrements parents, puis insérer des enregistrements enfants. Cette approche garantit que les enregistrements parents sont insérés avant les enregistrements enfants et que chaque enregistrement enfant possède un ID parent valide.

Une autre façon d'effectuer des insertions groupées imbriquées consiste à utiliser une technique appelée "mise en scène de table". La mise en scène de table implique la création de tables temporaires pour stocker des sous-enregistrements. L'enregistrement parent est inséré en premier, puis les enregistrements enfants sont insérés dans la table temporaire. Une fois que tous les enregistrements enfants ont été insérés, vous pouvez utiliser une instruction de fusion pour insérer les enregistrements enfants dans la table enfant réelle. L'avantage de cette approche est qu'elle garantit que les enregistrements enfants sont valides puisqu'ils sont vérifiés par rapport à la table parent avant leur insertion.

Enfin, vous pouvez utiliser la clause OUTPUT dans votre instruction insert pour capturer et utiliser la clé primaire (par exemple scope_identity()). Cela vous permettra de parcourir les entités enfants. Voici un exemple de cette approche :

<code>            using (var scope = tran.Connection.BeginTransaction())
            {
                using (connectionString.WithTransaction(tran))
                {
                    int scope_identity = 0;
                    foreach (var entity in dataload.Entities){
                        scope_identity = connectionString.ExecuteScalar<int>(
                            $"INSERT INTO tbl_owner(OwnerName) OUTPUT INSERTED.OwnerID Values(@Name)", entity);

                        foreach(var project in entity.Related)
                        {
                          connectionString.Execute(
                              $"INSERT INTO tbl_project(Name, OwnerId) Values(@Name, @OwnerId)",
                                new{Name = project.Name, OwnerId = scope_identity });
                        }
                    }
                    scope.Commit();
                }
            }</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal