Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Memasukkan Data ke dalam Tiga Jadual Postgres Secara Serentak Menggunakan Pertanyaan Tunggal?

Bagaimanakah Saya Boleh Memasukkan Data ke dalam Tiga Jadual Postgres Secara Serentak Menggunakan Pertanyaan Tunggal?

DDD
DDDasal
2025-01-12 14:38:42417semak imbas

How Can I Insert Data into Three Postgres Tables Simultaneously Using a Single Query?

Gunakan Postgres untuk memasukkan data ke dalam tiga jadual serentak

Andaikan anda perlu memasukkan data ke dalam tiga jadual serentak menggunakan satu pertanyaan. Struktur jadual adalah 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>

Anda perlu memastikan kunci utama untuk setiap sisipan dan kemudian gunakannya dalam jadual berikutnya. Walau bagaimanapun, melaksanakan satu pertanyaan untuk setiap sisipan tidak membenarkan penggunaan semula nilai kunci dengan serta-merta.

Penyelesaian: Pengubahsuaian data CTE

Untuk memasukkan data ke dalam tiga jadual secara serentak, anda boleh menggunakan pengubahsuaian data CTE (Common Table Expression). Mereka mewujudkan kebergantungan antara sisipan berturut-turut:

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

CTE pertama, ins1, memasukkan ke dalam jadual sampel dan mengembalikan kunci yang dijana (sample_id). Kemudian, ins2 memasukkan ke dalam sample1 menggunakan sample_id daripada ins1 dan mengembalikan user_id. Akhir sekali, INSERT ketiga memasukkan ke dalam sample2 menggunakan user_id.

Sediakan data lebih awal

Lazimnya lebih cekap untuk mentakrifkan baris data dalam CTE terlebih dahulu:

<code class="language-sql">WITH data(firstname, lastname, adddetails, value) AS (
  VALUES
    ('fai55', 'shaggk', 'ss', 'ss2'),
    ('fai56', 'XXaggk', 'xx', 'xx2')
)
...
-- (查询的其余部分保持不变)</code>

Ingat untuk mempertimbangkan faktor seperti kekangan keunikan, penukaran jenis dan pengendalian penulisan serentak untuk memastikan integriti data.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memasukkan Data ke dalam Tiga Jadual Postgres Secara Serentak Menggunakan Pertanyaan Tunggal?. 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