嵌套批次插入的一個挑戰在於插入順序。假設您使用它們之間的外鍵參考來建立父表和子表。在插入子記錄之前,通常需要存在父記錄。要處理此問題,必須先插入父記錄,然後再插入子記錄。
問題在於,在父記錄 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中文網其他相關文章!