ホームページ >データベース >mysql チュートリアル >Postgres CTE は複数のテーブルに同時にデータを挿入するのにどのように役立ちますか?

Postgres CTE は複数のテーブルに同時にデータを挿入するのにどのように役立ちますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-12 14:28:47285ブラウズ

How Can Postgres CTEs Help Insert Data into Multiple Tables Simultaneously?

Postgres CTE を使用した複数のテーブルへの同時データ挿入

相互接続された複数のデータベース テーブルにデータを効率的に挿入することは、複雑なデータ関係を管理するために重要です。 PostgreSQL の Common Table Expressions (CTE)、特にデータ変更 CTE は、堅牢なソリューションを提供します。

次のように定義された 3 つのテーブル samplesample1、および sample2 が関係するシナリオを考えてみましょう。

<code class="language-sql">CREATE TABLE sample (
   id        bigserial PRIMARY KEY,
   lastname  varchar(20),
   firstname varchar(20)
);

CREATE TABLE sample1(
   user_id    bigserial PRIMARY KEY,
   sample_id  bigint REFERENCES sample,
   adddetails varchar(20)
);

CREATE TABLE sample2(
   id      bigserial PRIMARY KEY,
   user_id bigint REFERENCES sample1,
   value   varchar(10)
);</code>

課題は、1 回の挿入で生成されたキーを、その後の関連テーブルへの挿入で再利用することにあります。 データ変更 CTE は、これをエレガントに解決します。

<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>

この連鎖 CTE アプローチにより、各 INSERT は先行するものの成功を条件として、順次挿入が保証されます。 SELECT の代わりに VALUES を使用すると、先行する INSERT が正常に完了した場合にのみダウンストリーム テーブルの挿入が続行されることが保証されます。

あるいは、より集中化されたアプローチでは、単一の CTE を使用してデータ行を定義します。

<code class="language-sql">WITH data(firstname, lastname, adddetails, value) AS (
   VALUES ('fai55', 'shaggk', 'ss', 'ss2')
   ),
ins1 AS (
   INSERT INTO sample (firstname, lastname)
   SELECT DISTINCT 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>
この方法では、重複する

の組み合わせを慎重に処理する必要があります。 同時書き込みに関する考慮事項も重要であり、さらなる調査が必要です (詳細については、追加のリソースを参照してください)。(firstname, lastname)

以上がPostgres CTE は複数のテーブルに同時にデータを挿入するのにどのように役立ちますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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