ホームページ >データベース >mysql チュートリアル >データの整合性を維持しながら複数の Postgres テーブルに同時にデータを挿入するにはどうすればよいですか?
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 サイトの他の関連記事を参照してください。