Menggunakan Postgres CTE untuk Sisipan Data Serentak Merentasi Berbilang Jadual
Memasukkan data dengan cekap ke dalam berbilang jadual pangkalan data yang saling berkaitan adalah penting untuk mengurus perhubungan data yang kompleks. Ungkapan Jadual Biasa (CTE) PostgreSQL, khususnya CTE yang mengubah suai data, menawarkan penyelesaian yang mantap.
Pertimbangkan senario yang melibatkan tiga jadual: sample
, sample1
dan sample2
, ditakrifkan seperti berikut:
<code class="language-sql">CREATE TABLE sample ( id bigserial PRIMARY KEY, lastname varchar(20), firstname varchar(20) ); CREATE TABLE sample1( user_id bigserial PRIMARY KEY, sample_id bigint REFERENCES sample, adddetails varchar(20) ); CREATE TABLE sample2( id bigserial PRIMARY KEY, user_id bigint REFERENCES sample1, value varchar(10) );</code>
Cabarannya terletak pada penggunaan semula kunci yang dijana daripada satu sisipan untuk sisipan seterusnya ke dalam jadual yang berkaitan. CTE yang mengubah suai data dengan elegan menyelesaikannya:
<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>
Pendekatan CTE berantai ini memastikan sisipan berurutan, dengan setiap INSERT
bergantung kepada kejayaan pendahulunya. Menggunakan SELECT
bukannya VALUES
menjamin bahawa sisipan jadual hiliran hanya diteruskan jika INSERT
sebelumnya berjaya diselesaikan.
Sebagai alternatif, pendekatan yang lebih terpusat menggunakan CTE tunggal untuk menentukan baris data:
<code class="language-sql">WITH data(firstname, lastname, adddetails, value) AS ( VALUES ('fai55', 'shaggk', 'ss', 'ss2') ), ins1 AS ( INSERT INTO sample (firstname, lastname) SELECT DISTINCT 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 memerlukan pengendalian yang teliti bagi gabungan (firstname, lastname)
pendua. Pertimbangan penulisan serentak juga penting dan memerlukan penyiasatan lanjut (lihat sumber tambahan untuk butiran).
Atas ialah kandungan terperinci Bagaimanakah CTE Postgres Boleh Membantu Memasukkan Data ke dalam Berbilang Jadual Secara serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!