ホームページ >データベース >mysql チュートリアル >単一のクエリで複数の関連する Postgres テーブルにデータを挿入するにはどうすればよいですか?
このガイドでは、特に最初の挿入で主キーを取得し、それ以降の挿入で外部キーとして利用する必要がある場合に、単一の SQL クエリを使用して相互接続された複数の Postgres テーブルにデータを挿入するという課題に対処します。
問題: 1 つのクエリ内で 3 つ以上の関連テーブルにデータを効率的に挿入し、適切な外部キー関係が維持されるようにします。
解決策: データ変更 CTE の活用
Common Table Expressions (CTE) は、洗練されたソリューションを提供します。 データ変更 CTE を使用すると、連続した INSERT 操作が可能になります。この場合、後続の各挿入は、前の挿入の結果に依存します。
実装例:
以下は、データ変更 CTE を使用して 3 つのテーブル (sample
、sample1
、sample2
) にデータを挿入する方法を示しています。
<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>
説明:
ins1
: sample
テーブルに行を挿入し、新しく生成された id
(主キー) を sample_id
として返します。ins2
: sample_id
の ins1
を使用して sample1
に行を挿入し、生成された user_id
を返します。INSERT
: user_id
の ins2
を使用して、データを 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
を使用して、潜在的な重複キー エラーを管理します。この包括的なアプローチは、単一のクエリ内で関連する Postgres テーブル全体へのデータ挿入を管理するための堅牢かつ効率的な方法を提供します。
以上が単一のクエリで複数の関連する Postgres テーブルにデータを挿入するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。