Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Memasukkan Data ke dalam Berbilang Jadual Postgres Berkaitan dalam Satu Pertanyaan?

Bagaimana untuk Memasukkan Data ke dalam Berbilang Jadual Postgres Berkaitan dalam Satu Pertanyaan?

DDD
Lepaskan: 2025-01-12 14:50:41
asal
138 orang telah melayarinya

How to Insert Data into Multiple Related Postgres Tables in a Single Query?

Sisipan Data Pertanyaan Tunggal Merentas Berbilang Jadual Postgres Berkaitan

Panduan ini menangani cabaran memasukkan data ke dalam berbilang jadual Postgres yang saling berkaitan menggunakan satu pertanyaan SQL, khususnya apabila perlu mendapatkan kunci utama daripada sisipan awal dan menggunakannya sebagai kunci asing dalam sisipan berikutnya.

Masalahnya: Memasukkan data ke dalam tiga atau lebih jadual berkaitan dengan cekap dalam satu pertanyaan, memastikan perhubungan kunci asing yang betul dikekalkan.

Penyelesaian: Memanfaatkan CTE Pengubahsuaian Data

Ungkapan Meja Biasa (CTE) menawarkan penyelesaian yang elegan. CTE yang mengubah suai data membenarkan operasi INSERT secara berurutan, di mana setiap sisipan berikutnya bergantung pada keputusan yang sebelumnya.

Contoh Pelaksanaan:

Yang berikut menunjukkan memasukkan data ke dalam tiga jadual (sample, sample1, sample2) menggunakan CTE pengubah suai data:

<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>
Salin selepas log masuk

Penjelasan:

  1. ins1: Memasukkan baris ke dalam jadual sample dan mengembalikan id (kunci utama) yang baru dijana sebagai sample_id.
  2. ins2: Menggunakan sample_id daripada ins1 untuk memasukkan baris ke dalam sample1, mengembalikan user_id yang dijana.
  3. Akhir INSERT: Menggunakan user_id daripada ins2 untuk memasukkan data ke dalam sample2.

Alternatif: Sisipan Kelompok dengan CTE

Pendekatan ini mengendalikan berbilang baris data serentak:

<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>
Salin selepas log masuk

Ini dengan cekap memasukkan berbilang baris dengan mentakrifkannya dalam data CTE.

Pertimbangan Penting:

  • Kekangan Utama Asing: Pastikan kekangan kunci asing yang sesuai ditakrifkan untuk mengekalkan integriti rujukan.
  • Klausa KONFLIK: Gunakan ON CONFLICT untuk mengurus kemungkinan ralat kunci pendua.
  • Keselarasan: Berhati-hati dengan kemungkinan keadaan perlumbaan semasa penulisan data serentak.

Pendekatan komprehensif ini menyediakan kaedah yang mantap dan cekap untuk mengurus sisipan data merentas jadual Postgres yang berkaitan dalam satu pertanyaan.

Atas ialah kandungan terperinci Bagaimana untuk Memasukkan Data ke dalam Berbilang Jadual Postgres Berkaitan dalam Satu Pertanyaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan