Rumah > pangkalan data > tutorial mysql > Bagaimanakah CTE Postgres Boleh Membantu Memasukkan Data ke dalam Berbilang Jadual Secara serentak?

Bagaimanakah CTE Postgres Boleh Membantu Memasukkan Data ke dalam Berbilang Jadual Secara serentak?

Mary-Kate Olsen
Lepaskan: 2025-01-12 14:28:47
asal
235 orang telah melayarinya

How Can Postgres CTEs Help Insert Data into Multiple Tables Simultaneously?

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

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

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

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan