首頁 >資料庫 >mysql教程 >如何使用預存程序有效率地將資料插入複雜資料結構的父表和子表中,確保正確的資料映射和最佳效能?

如何使用預存程序有效率地將資料插入複雜資料結構的父表和子表中,確保正確的資料映射和最佳效能?

DDD
DDD原創
2025-01-14 19:12:44452瀏覽

高效插入複雜資料結構中父子表資料的預存程序

問題:

在複雜的資料庫結構中,如何使用預存程序有效率地將資料插入父子表中,同時確保資料映射正確並最佳化效能?

解:

為了有效率地將資料插入父子表,請遵循以下步驟:

  1. 建立臨時ID列: 在使用者自訂表 (UDT) 中新增一個 EmployeeId 列,用於保存每位員工的臨時ID。

  2. 使用臨時ID填充UDT: 將資料插入UDT,包括臨時ID。

  3. 建立EmployeeID映射表: 宣告一個表格變數 (@EmployeeidMap) 來對應從員工表插入的值到UDT中的臨時員工ID。

  4. 使用MERGE語句插入員工表: 使用 MERGE 語句將資料插入 @MainEmployee 表,並將來源資料員工ID和插入的員工ID輸出到映射表中。

  5. 插入ParentEmployeeDepartment表: 將UDT與映射表連接,取得實際的員工ID,並將資料插入 @ParentEmployeeDepartment 表。

  6. 對應到ParentEmployeeDepartmentID: 使用 @ParentEmployeeDepartment 中的數據,將 ParentEmployeeDepartmentID 中的實際值對應到預存程序發送的資料。

  7. 插入子表: 使用 Parent 表中的 EmployeeIDDepartmentType 來決定要將資料插入哪個子表。

代碼:

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

輸出:

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

注意:

此解決方案使用映射表來有效匹配表之間的不同資料。它避免了逐行操作,並優化了效能,使其適用於大型資料集。

How can I efficiently insert data into parent and child tables in a complex data structure using a stored procedure, ensuring proper data mapping and optimal performance?

以上是如何使用預存程序有效率地將資料插入複雜資料結構的父表和子表中,確保正確的資料映射和最佳效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn