Diese Anleitung befasst sich mit der Herausforderung, Daten mit einer einzigen SQL-Abfrage in mehrere miteinander verbundene Postgres-Tabellen einzufügen, insbesondere wenn ein Primärschlüssel aus einer ersten Einfügung abgerufen und bei nachfolgenden Einfügungen als Fremdschlüssel verwendet werden muss.
Das Problem: Effizientes Einfügen von Daten in drei oder mehr verwandte Tabellen innerhalb einer einzigen Abfrage, um sicherzustellen, dass die richtigen Fremdschlüsselbeziehungen beibehalten werden.
Lösung: Nutzung datenverändernder CTEs
Common Table Expressions (CTEs) bieten eine elegante Lösung. Datenmodifizierende CTEs ermöglichen sequentielle INSERT-Operationen, bei denen jede nachfolgende Einfügung auf den Ergebnissen der vorherigen basiert.
Implementierungsbeispiel:
Im Folgenden wird das Einfügen von Daten in drei Tabellen (sample
, sample1
, sample2
) mithilfe datenmodifizierender CTEs veranschaulicht:
<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>
Erklärung:
ins1
: Fügt eine Zeile in die Tabelle sample
ein und gibt den neu generierten id
(Primärschlüssel) als sample_id
zurück.ins2
: Verwendet das sample_id
von ins1
, um eine Zeile in sample1
einzufügen und das generierte user_id
zurückzugeben.INSERT
: Verwendet das user_id
von ins2
, um Daten in sample2
einzufügen.Alternative: Batch-Einfügung mit CTEs
Dieser Ansatz verarbeitet mehrere Datenzeilen gleichzeitig:
<code class="language-sql">WITH data(firstname, lastname, adddetails, value) AS ( VALUES ('fai55', 'shaggk', 'ss', 'ss2'), ('fai56', 'XXaggk', 'xx', 'xx2') ), ins1 AS ( INSERT INTO sample (firstname, lastname) SELECT 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>
Dadurch werden mehrere Zeilen effizient eingefügt, indem sie innerhalb des data
CTE.
Wichtige Überlegungen:
ON CONFLICT
, um potenzielle Fehler durch doppelte Schlüssel zu verwalten.Dieser umfassende Ansatz bietet eine robuste und effiziente Methode zum Verwalten der Dateneinfügung in verwandte Postgres-Tabellen innerhalb einer einzigen Abfrage.
Das obige ist der detaillierte Inhalt vonWie füge ich Daten in mehrere verwandte Postgres-Tabellen in einer einzigen Abfrage ein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!