Heim >Datenbank >MySQL-Tutorial >Wie können Postgres-CTEs dabei helfen, Daten gleichzeitig in mehrere Tabellen einzufügen?
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!