嵌套批量插入的一个挑战在于插入顺序。假设您使用它们之间的外键引用来创建父表和子表。在插入子记录之前,通常需要存在父记录。要处理此问题,必须先插入父记录,然后再插入子记录。
问题在于,在父记录 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中文网其他相关文章!