首頁 >資料庫 >mysql教程 >如何處理具有外鍵約束的嵌套批次插入?

如何處理具有外鍵約束的嵌套批次插入?

Barbara Streisand
Barbara Streisand原創
2025-01-13 07:42:43240瀏覽

How to Handle Nested Bulk Inserts with Foreign Key Constraints?

嵌套批次插入的一個挑戰在於插入順序。假設您使用它們之間的外鍵參考來建立父表和子表。在插入子記錄之前,通常需要存在父記錄。要處理此問題,必須先插入父記錄,然後再插入子記錄。

問題在於,在父記錄 ID 可用之前,您無法插入子記錄。克服此問題的一種方法是使用預存程序插入記錄。預存程序可以先插入父記錄,然後再插入子記錄。這種方法確保在子記錄之前插入父記錄,並且每個子記錄都有有效的父 ID。

執行巢狀批次插入的另一種方法是使用稱為「表暫存」的技術。表暫存涉及建立臨時表以儲存子記錄。首先插入父記錄,然後將子記錄插入臨時表。一旦插入所有子記錄,就可以使用合併語句將子記錄插入實際的子表。這種方法的優點是確保子記錄有效,因為在插入之前會針對父表檢查它們。

最後,您可以在插入語句中使用 OUTPUT 子句來擷取並使用主鍵(例如 scope_identity())。這將使您能夠循環處理子實體。以下是此方法的範例:

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

以上是如何處理具有外鍵約束的嵌套批次插入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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