ホームページ >データベース >mysql チュートリアル >データの整合性を維持しながら複数の Postgres テーブルに同時にデータを挿入するにはどうすればよいですか?

データの整合性を維持しながら複数の Postgres テーブルに同時にデータを挿入するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-12 14:36:41926ブラウズ

How can I insert data into multiple Postgres tables simultaneously while maintaining data integrity?

PostgreSQL で複数のテーブルに同時にデータを挿入します

単一のクエリを使用して複数のテーブルにデータを挿入すると、データベース操作の一貫性と効率が確保されます。これは、以下に示すようにデータ変更共通テーブル式 (CTE) を使用することで実現できます。

データを使用して CTE を変更します:

次のクエリは、データ変更 CTE を使用して、3 つのテーブルにデータを連続的に挿入します。

<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>
各 INSERT は前の INSERT に依存し、正しいキーが取得され、後続の挿入で使用されることが保証されます。

または、完全なデータ行を指定します:

より便利な方法は、CTE を使用して完全なデータ行を 1 か所に提供することです:

<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>
このメソッドでは、複数行のデータを挿入でき、最初の INSERT に異なる値を選択することで重複行を処理します。

同時実行性と一意の制約の問題の解決:

潜在的な同時実行性の問題を解決し、データの整合性を確保するには、

テーブルの sample 列に (firstname, lastname) 制約を追加し、UNIQUE クエリで INSERT 句を使用できます。リンク先の参考資料に記載されているとおりです。 ON CONFLICT

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

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