Maison >base de données >tutoriel mysql >Comment puis-je insérer efficacement des données dans des tables parent et enfant dans une structure de données complexe à l'aide d'une procédure stockée, garantissant ainsi un mappage de données approprié et des performances optimales ?
Une procédure stockée pour insérer efficacement des données de table parent-enfant dans des structures de données complexes
Question :
Dans une structure de base de données complexe, comment utiliser des procédures stockées pour insérer efficacement des données dans des tables parent-enfant tout en garantissant un mappage correct des données et en optimisant les performances ?
Solution :
Pour insérer efficacement des données dans des tables parent-enfant, suivez ces étapes :
Créez une colonne d'ID temporaire : Ajoutez une colonne EmployeeId
dans la table définie par l'utilisateur (UDT) pour enregistrer l'ID temporaire de chaque employé.
Remplir l'UDT avec un identifiant temporaire : Insérez des données dans l'UDT, y compris un identifiant temporaire.
Créer une table de mappage EmployeeID : Déclarez une variable de table (@EmployeeidMap
) pour mapper la valeur insérée dans la table des employés à l'ID d'employé temporaire dans l'UDT.
Utilisez l'instruction MERGE pour insérer dans la table des employés : Utilisez l'instruction MERGE
pour insérer des données dans la table @MainEmployee
et affichez l'ID d'employé des données sources et l'ID d'employé inséré dans le mappage tableau.
Insérer dans la table ParentEmployeeDepartment : Rejoignez l'UDT avec la table de mappage, obtenez l'ID réel de l'employé et insérez les données dans la table @ParentEmployeeDepartment
.
correspond à ParentEmployeeDepartmentID : À l'aide des données de @ParentEmployeeDepartment
, mappez la valeur réelle de ParentEmployeeDepartmentID
aux données envoyées par la procédure stockée.
Insérer dans une sous-table : Utilisez Parent
et EmployeeID
de la table DepartmentType
pour déterminer dans quelle sous-table vous souhaitez insérer des données.
Code :
<code class="language-sql">-- 创建EmployeeID映射表 DECLARE @EmployeeidMap TABLE (temp_id int, id int); -- 使用MERGE语句插入员工表 MERGE INTO @MainEmployee USING @tEmployeeData AS sourceData ON 1 = 0 WHEN NOT MATCHED THEN INSERT (FirstName, LastName) VALUES (sourceData.FirstName, sourceData.LastName) OUTPUT sourceData.EmployeeId, inserted.EmployeeID INTO @EmployeeidMap; -- 插入ParentEmployeeDepartment表 INSERT INTO @ParentEmployeeDepartment (EmployeeID, DepartmentType) SELECT Id, DepartmentType FROM @tEmployeeData INNER JOIN @EmployeeidMap ON EmployeeID = temp_id; -- 映射到ParentEmployeeDepartmentID SELECT FirstName, LastName, SentData.DepartmentType AS [Dept. Type], DepartmentBuilding AS Building, DepartmentEmployeeLevel AS [Emp. Level], DepartmentTypeAMetadata AS [A Meta], DepartmentTypeBMetadata AS [B Meta], SentData.EmployeeId AS TempId, EmpMap.id AS [Emp. Id], DeptMap.ParentEmployeeDepartmentID AS [Dept. Id] FROM @tEmployeeData SentData INNER JOIN @EmployeeidMap EmpMap ON SentData.EmployeeId = temp_id INNER JOIN @ParentEmployeeDepartment DeptMap ON EmpMap.id = DeptMap.EmployeeID;</code>
Sortie :
FirstName | LastName | Dept. Type | Building | Emp. Level | A Meta | B Meta | TempId | Emp. Id | Dept. Id |
---|---|---|---|---|---|---|---|---|---|
Dave_FN | Dave_LN | B | OpenC | XII | NULL | Lab | 8 | 1 | 1 |
Joe_FN | Joe_LN | A | 101 | IV | Tech/IT | NULL | 7 | 2 | 2 |
Mike_FN | Mike_LN | B | OpenH | XII | NULL | Med | 6 | 3 | 3 |
Tom_FN | Tom_LN | A | 101 | IV | Tech/IT | NULL | 5 | 4 | 4 |
Remarque :
Cette solution utilise des tables de mappage pour faire correspondre efficacement différentes données entre les tables. Il évite les opérations ligne par ligne et optimise les performances, ce qui le rend adapté aux grands ensembles 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!