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>
Penjelasan:
ins1
: Memasukkan baris ke dalam jadual sample
dan mengembalikan id
(kunci utama) yang baru dijana sebagai sample_id
.ins2
: Menggunakan sample_id
daripada ins1
untuk memasukkan baris ke dalam sample1
, mengembalikan user_id
yang dijana.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>
Ini dengan cekap memasukkan berbilang baris dengan mentakrifkannya dalam data
CTE.
Pertimbangan Penting:
ON CONFLICT
untuk mengurus kemungkinan ralat kunci pendua.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!