Heim > Datenbank > MySQL-Tutorial > Wie füge ich Daten in mehrere verwandte Postgres-Tabellen in einer einzigen Abfrage ein?

Wie füge ich Daten in mehrere verwandte Postgres-Tabellen in einer einzigen Abfrage ein?

DDD
Freigeben: 2025-01-12 14:50:41
Original
137 Leute haben es durchsucht

How to Insert Data into Multiple Related Postgres Tables in a Single Query?

Dateneinfügung mit einer einzigen Abfrage über mehrere verwandte Postgres-Tabellen hinweg

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>
Nach dem Login kopieren

Erklärung:

  1. ins1: Fügt eine Zeile in die Tabelle sample ein und gibt den neu generierten id (Primärschlüssel) als sample_id zurück.
  2. ins2: Verwendet das sample_id von ins1, um eine Zeile in sample1 einzufügen und das generierte user_id zurückzugeben.
  3. Final 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>
Nach dem Login kopieren

Dadurch werden mehrere Zeilen effizient eingefügt, indem sie innerhalb des data CTE.

definiert werden

Wichtige Überlegungen:

  • Fremdschlüsseleinschränkungen: Stellen Sie sicher, dass geeignete Fremdschlüsseleinschränkungen definiert sind, um die referenzielle Integrität aufrechtzuerhalten.
  • ON CONFLICT-Klausel: Verwenden Sie ON CONFLICT, um potenzielle Fehler durch doppelte Schlüssel zu verwalten.
  • Parallelität: Achten Sie bei gleichzeitigen Datenschreibvorgängen auf mögliche Rennbedingungen.

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage