ホームページ > データベース > mysql チュートリアル > ストアド プロシージャでユーザー定義のテーブル タイプを使用して、親テーブルと子テーブルにデータを効率的に挿入するにはどうすればよいですか?

ストアド プロシージャでユーザー定義のテーブル タイプを使用して、親テーブルと子テーブルにデータを効率的に挿入するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-14 19:21:46
オリジナル
802 人が閲覧しました

How to Efficiently Insert Data into Parent and Child Tables Using a User-Defined Table Type in a Stored Procedure?

ストアド プロシージャ内の親テーブルと子テーブルへの効率的なデータの入力

このドキュメントでは、データ入力にユーザー定義テーブル タイプ (UDT) を利用して、ストアド プロシージャ内の親テーブルと子テーブルにデータを効率的に挿入するソリューションの概要を説明します。 このアプローチは、データの整合性を維持し、行ごとの操作に伴うパフォーマンスのボトルネックを回避するという課題に対処します。

課題: データの整合性とパフォーマンス

課題は、UDT からのデータをストアド プロシージャ内の複数の関連テーブル (親テーブルとそれに関連付けられた子テーブル) に正確にマッピングすることにあります。 単純な行ごとの挿入は、特に大規模なデータセットを扱う場合、非効率的でエラーが発生しやすい可能性があります。

解決策: 複数段階のアプローチ

このソリューションは、効率とデータの整合性の両方を確保するために複数のステップのプロセスを採用しています:

  1. UDT の拡張: 一時 ID 列 (temp_id) を UDT に追加します。これは、UDT 内の各行の一意の識別子として機能し、挿入プロセス全体でデータを追跡するために重要です。

  2. 親テーブルの挿入に MERGE を使用する: MERGE ステートメントは、親テーブル (@MainEmployee) にデータを効率的に挿入します。 重要なことに、その OUTPUT 句は一時 ID (UDT からの temp_id) と親テーブルから新しく生成された EmployeeID の両方をキャプチャします。

  3. マッピング テーブルの作成: OUTPUT ステートメントからの MERGE データにより、一時マッピング テーブル (@EmployeeidMap) が設定されます。このテーブルは、一時的な temp_id を親テーブルで生成された実際の EmployeeID にリンクします。

  4. ID マッピングを使用した親テーブルの作成: 次に、@EmployeeidMap テーブルを使用して UDT データを親テーブル (@ParentEmployeeDepartment) に結合し、正しい EmployeeID が各親に割り当てられるようにします。記録します。

  5. 子テーブルの作成: 最後に、@ChildEmployeeDepartmentTypeA テーブルと @ChildEmployeeDepartmentTypeB テーブルの両方との結合を使用して、子テーブル (@EmployeeidMap@ParentEmployeeDepartment) にデータが設定されます。これにより、親レコードと子レコードの間に必要な関係が確立されます。

コード例:

次のコードは、この強化されたアプローチを示しています。

<code class="language-sql">CREATE TYPE dbo.tEmployeeData AS TABLE 
(
     FirstName NVARCHAR(50),
     LastName NVARCHAR(50),
     DepartmentType NVARCHAR(10),
     DepartmentBuilding NVARCHAR(50),
     DepartmentEmployeeLevel NVARCHAR(10),
     DepartmentTypeAMetadata NVARCHAR(100),
     DepartmentTypeBMetadata NVARCHAR(100),
     temp_id INT IDENTITY(1,1) -- Added temporary ID column
)
GO

CREATE PROC dbo.EmployeeImport 
    (@tEmployeeData dbo.tEmployeeData READONLY)
AS
BEGIN
    -- ... (Temporary table declarations remain the same as in the original example) ...

    -- MERGE into @MainEmployee table
    MERGE INTO @MainEmployee USING @tEmployeeData AS sourceData ON 1 = 0
    WHEN NOT MATCHED THEN
        INSERT (FirstName, LastName)
        VALUES (sourceData.FirstName, sourceData.LastName)
    OUTPUT sourceData.temp_id, inserted.EmployeeID 
    INTO @EmployeeidMap;

    -- ... (Remaining INSERT statements adjusted to use @EmployeeidMap for joining) ...
END
GO</code>
ログイン後にコピー

この洗練された戦略により、効率的かつ正確なデータ挿入が保証され、潜在的に大規模なデータセットを効果的に処理しながら、親テーブルと子テーブル間の参照整合性が維持されます。

以上がストアド プロシージャでユーザー定義のテーブル タイプを使用して、親テーブルと子テーブルにデータを効率的に挿入するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート