Heim >Datenbank >MySQL-Tutorial >Wie können Postgres-CTEs dabei helfen, Daten gleichzeitig in mehrere Tabellen einzufügen?

Wie können Postgres-CTEs dabei helfen, Daten gleichzeitig in mehrere Tabellen einzufügen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-12 14:28:47237Durchsuche

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

Verwendung von Postgres-CTEs für die gleichzeitige Dateneinfügung über mehrere Tabellen hinweg

Das effiziente Einfügen von Daten in mehrere miteinander verbundene Datenbanktabellen ist für die Verwaltung komplexer Datenbeziehungen von entscheidender Bedeutung. Die Common Table Expressions (CTEs) von PostgreSQL, insbesondere datenmodifizierende CTEs, bieten eine robuste Lösung.

Stellen Sie sich ein Szenario mit drei Tabellen vor: sample, sample1 und sample2, die wie folgt definiert sind:

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

Die Herausforderung besteht darin, generierte Schlüssel aus einer Einfügung für nachfolgende Einfügungen in verwandte Tabellen wiederzuverwenden. Datenmodifizierende CTEs lösen dieses Problem elegant:

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

Dieser verkettete CTE-Ansatz gewährleistet eine sequentielle Einfügung, wobei jedes INSERT vom Erfolg seines Vorgängers abhängt. Die Verwendung von SELECT anstelle von VALUES garantiert, dass nachgelagerte Tabelleneinfügungen nur dann fortgesetzt werden, wenn das vorangehende INSERT erfolgreich abgeschlossen wird.

Alternativ verwendet ein zentralerer Ansatz einen einzigen CTE, um Datenzeilen zu definieren:

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

Diese Methode erfordert einen sorgfältigen Umgang mit doppelten (firstname, lastname) Kombinationen. Überlegungen zum gleichzeitigen Schreiben sind ebenfalls wichtig und erfordern weitere Untersuchungen (Einzelheiten finden Sie in den zusätzlichen Ressourcen).

Das obige ist der detaillierte Inhalt vonWie können Postgres-CTEs dabei helfen, Daten gleichzeitig in mehrere Tabellen einzufügen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn