ホームページ >データベース >mysql チュートリアル >単一のクエリを使用して 3 つの Postgres テーブルに同時にデータを挿入するにはどうすればよいですか?

単一のクエリを使用して 3 つの Postgres テーブルに同時にデータを挿入するにはどうすればよいですか?

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

How Can I Insert Data into Three Postgres Tables Simultaneously Using a Single Query?

Postgres を使用して 3 つのテーブルに同時にデータを挿入します

単一のクエリを使用して 3 つのテーブルに同時にデータを挿入する必要があるとします。テーブル構造は次のとおりです:

<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

3 つのテーブルに同時にデータを挿入するには、データ変更 CTE (Common Table Expression) を使用できます。これらは、連続する挿入間の依存関係を確立します:

<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、ins1 はサンプル テーブルに挿入し、生成されたキー (sample_id) を返します。次に、ins2 は、ins1 のサンプル ID を使用してサンプル 1 に挿入し、ユーザー ID を返します。最後に、3 番目の INSERT は user_id を使用してサンプル 2 に挿入します。

事前にデータを提供してください

通常は、CTE でデータ行を事前に定義する方が効率的です。

<code class="language-sql">WITH data(firstname, lastname, adddetails, value) AS (
  VALUES
    ('fai55', 'shaggk', 'ss', 'ss2'),
    ('fai56', 'XXaggk', 'xx', 'xx2')
)
...
-- (查询的其余部分保持不变)</code>

データの整合性を確保するために、一意性の制約、型変換、同時書き込みの処理などの要素を必ず考慮してください。

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

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