ホームページ >データベース >mysql チュートリアル >単一のクエリで複数の関連する Postgres テーブルにデータを挿入するにはどうすればよいですか?

単一のクエリで複数の関連する Postgres テーブルにデータを挿入するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-12 14:50:41137ブラウズ

How to Insert Data into Multiple Related Postgres Tables in a Single Query?

複数の関連する Postgres テーブルにわたる単一クエリ データの挿入

このガイドでは、特に最初の挿入で主キーを取得し、それ以降の挿入で外部キーとして利用する必要がある場合に、単一の SQL クエリを使用して相互接続された複数の Postgres テーブルにデータを挿入するという課題に対処します。

問題: 1 つのクエリ内で 3 つ以上の関連テーブルにデータを効率的に挿入し、適切な外部キー関係が維持されるようにします。

解決策: データ変更 CTE の活用

Common Table Expressions (CTE) は、洗練されたソリューションを提供します。 データ変更 CTE を使用すると、連続した INSERT 操作が可能になります。この場合、後続の各挿入は、前の挿入の結果に依存します。

実装例:

以下は、データ変更 CTE を使用して 3 つのテーブル (samplesample1sample2) にデータを挿入する方法を示しています。

<code class="language-sql">WITH ins1 AS (
   INSERT INTO sample(firstname, lastname)
   VALUES ('fai55', 'shaggk')
   RETURNING id AS sample_id
   ),
ins2 AS (
   INSERT INTO sample1 (sample_id, adddetails)
   SELECT sample_id, 'ss' FROM ins1
   RETURNING user_id
   )
INSERT INTO sample2 (user_id, value)
SELECT user_id, 'ss2' FROM ins2;</code>

説明:

  1. ins1: sample テーブルに行を挿入し、新しく生成された id (主キー) を sample_id として返します。
  2. ins2: sample_idins1 を使用して sample1 に行を挿入し、生成された user_id を返します。
  3. 最終 INSERT: user_idins2 を使用して、データを sample2 に挿入します。

代替: CTE を使用したバッチ挿入

このアプローチは複数のデータ行を同時に処理します:

<code class="language-sql">WITH data(firstname, lastname, adddetails, value) AS (
   VALUES
      ('fai55', 'shaggk', 'ss', 'ss2'),
      ('fai56', 'XXaggk', 'xx', 'xx2')
   ),
ins1 AS (
   INSERT INTO sample (firstname, lastname)
   SELECT firstname, lastname FROM data
   RETURNING firstname, lastname, id AS sample_id
   ),
ins2 AS (
   INSERT INTO sample1 (sample_id, adddetails)
   SELECT ins1.sample_id, d.adddetails
   FROM   data d
   JOIN   ins1 USING (firstname, lastname)
   RETURNING sample_id, user_id
   )
INSERT INTO sample2 (user_id, value)
SELECT ins2.user_id, d.value
FROM   data d
JOIN   ins1 USING (firstname, lastname)
JOIN   ins2 USING (sample_id);</code>

これにより、data CTE 内で定義することで複数の行が効率的に挿入されます。

重要な考慮事項:

  • 外部キー制約: 参照整合性を維持するために適切な外部キー制約が定義されていることを確認します。
  • ON CONFLICT 句: ON CONFLICT を使用して、潜在的な重複キー エラーを管理します。
  • 同時実行性: 同時データ書き込み中の潜在的な競合状態に注意してください。

この包括的なアプローチは、単一のクエリ内で関連する Postgres テーブル全体へのデータ挿入を管理するための堅牢かつ効率的な方法を提供します。

以上が単一のクエリで複数の関連する Postgres テーブルにデータを挿入するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。