ネストされたバッチ挿入に関する課題の 1 つは、挿入順序です。外部キー参照を使用して親テーブルと子テーブルを作成するとします。通常、子レコードを挿入するには、親レコードが存在している必要があります。この問題に対処するには、最初に親レコードを挿入し、次に子レコードを挿入する必要があります。
問題は、親レコード ID が使用可能になるまでは子レコードを挿入できないことです。この問題を解決する 1 つの方法は、ストアド プロシージャを使用してレコードを挿入することです。ストアド プロシージャは、最初に親レコードを挿入し、次に子レコードを挿入できます。このアプローチにより、親レコードが子レコードの前に挿入され、各子レコードが有効な親 ID を持つことが保証されます。
ネストされた一括挿入を実行するもう 1 つの方法は、「テーブル ステージング」と呼ばれる手法を使用することです。テーブルのステージングには、サブレコードを保存するための一時テーブルの作成が含まれます。最初に親レコードが挿入され、次に子レコードが一時テーブルに挿入されます。すべての子レコードが挿入されたら、merge ステートメントを使用して子レコードを実際の子テーブルに挿入できます。このアプローチの利点は、子レコードが挿入前に親テーブルに対してチェックされるため、子レコードが有効であることが保証されることです。
最後に、挿入ステートメントで 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 中国語 Web サイトの他の関連記事を参照してください。