Rumah >pangkalan data >tutorial mysql >Bagaimanakah saya boleh memasukkan data ke dalam beberapa jadual Postgres secara serentak sambil mengekalkan integriti data?

Bagaimanakah saya boleh memasukkan data ke dalam beberapa jadual Postgres secara serentak sambil mengekalkan integriti data?

Susan Sarandon
Susan Sarandonasal
2025-01-12 14:36:41927semak imbas

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

Masukkan data ke dalam berbilang jadual serentak dalam PostgreSQL

Menggunakan satu pertanyaan untuk memasukkan data ke dalam berbilang jadual memastikan ketekalan dan kecekapan operasi pangkalan data. Ini boleh dicapai dengan menggunakan data yang mengubah suai ungkapan jadual biasa (CTE) seperti yang ditunjukkan di bawah:

Ubah suai CTE menggunakan data:

Pertanyaan berikut menggunakan CTE pengubahsuaian data untuk memasukkan data secara berterusan ke dalam tiga jadual:

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

Setiap INSERT bergantung pada INSERT sebelumnya, memastikan kekunci yang betul diperoleh dan digunakan dalam sisipan berikutnya.

Sebagai alternatif, dengan menyediakan baris data lengkap:

Cara yang lebih mudah ialah menggunakan CTE untuk menyediakan baris data yang lengkap di satu tempat:

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

Kaedah ini membenarkan berbilang baris data untuk disisipkan dan ia mengendalikan baris pendua dengan memilih nilai yang berbeza untuk INSERT pertama.

Menyelesaikan isu konkurensi dan kekangan unik:

Untuk menyelesaikan isu konkurensi yang berpotensi dan memastikan integriti data, anda boleh menambah sample kekangan dalam lajur (firstname, lastname) jadual UNIQUE dan anda boleh menggunakan klausa INSERT dalam pertanyaan ON CONFLICT, sebagai di bawah seperti yang diterangkan dalam rujukan yang dipautkan.

Atas ialah kandungan terperinci Bagaimanakah saya boleh memasukkan data ke dalam beberapa jadual Postgres secara serentak sambil mengekalkan integriti data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn