Heim >Datenbank >MySQL-Tutorial >Wie kann ich Daten gleichzeitig in mehrere Postgres-Tabellen einfügen und dabei die Datenintegrität wahren?

Wie kann ich Daten gleichzeitig in mehrere Postgres-Tabellen einfügen und dabei die Datenintegrität wahren?

Susan Sarandon
Susan SarandonOriginal
2025-01-12 14:36:41932Durchsuche

How can I insert data into multiple Postgres tables simultaneously while maintaining data integrity?

Daten in mehrere Tabellen gleichzeitig in PostgreSQL einfügen

Die Verwendung einer einzigen Abfrage zum Einfügen von Daten in mehrere Tabellen gewährleistet Konsistenz und Effizienz der Datenbankvorgänge. Dies kann durch die Verwendung eines datenmodifizierenden allgemeinen Tabellenausdrucks (CTE) erreicht werden, wie unten gezeigt:

CTE mithilfe von Daten ändern:

Die folgende Abfrage verwendet einen Datenänderungs-CTE, um kontinuierlich Daten in drei Tabellen einzufügen:

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

Jeder INSERT hängt vom vorherigen INSERT ab, um sicherzustellen, dass die richtigen Schlüssel erhalten und in nachfolgenden Einsätzen verwendet werden.

Alternativ durch Bereitstellung der vollständigen Datenzeile:

Eine bequemere Möglichkeit besteht darin, CTE zu verwenden, um die gesamte Datenzeile an einem Ort bereitzustellen:

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

Diese Methode ermöglicht das Einfügen mehrerer Datenzeilen und behandelt doppelte Zeilen, indem für das erste INSERT ein anderer Wert ausgewählt wird.

Probleme mit Parallelität und eindeutigen Einschränkungen lösen:

Um potenzielle Parallelitätsprobleme zu lösen und die Datenintegrität sicherzustellen, können Sie sample-Einschränkungen in den (firstname, lastname)-Spalten der UNIQUE-Tabelle hinzufügen und die INSERT-Klausel in der ON CONFLICT-Abfrage verwenden unten, wie in der verlinkten Referenz beschrieben.

Das obige ist der detaillierte Inhalt vonWie kann ich Daten gleichzeitig in mehrere Postgres-Tabellen einfügen und dabei die Datenintegrität wahren?. 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