Heim > Datenbank > MySQL-Tutorial > Wie rufe ich IDs eingefügter und widersprüchlicher Zeilen mithilfe von PostgreSQLs ON CONFLICT ab?

Wie rufe ich IDs eingefügter und widersprüchlicher Zeilen mithilfe von PostgreSQLs ON CONFLICT ab?

Linda Hamilton
Freigeben: 2025-01-21 18:21:08
Original
288 Leute haben es durchsucht

How to Retrieve IDs of Inserted and Conflicting Rows Using PostgreSQL's ON CONFLICT?

Abrufen von IDs von PostgreSQL-UPSERTs mit ON CONFLICT

Herausforderung: Standard PostgreSQL 9.5 ON CONFLICT DO NOTHING mit RETURNING id gibt keine IDs für widersprüchliche Zeilen zurück. Das Ziel besteht darin, die IDs sowohl neu eingefügter Zeilen als auch vorhandener Zeilen abzurufen, die während eines Upsert-Vorgangs in Konflikte verwickelt sind.

Lösung:

Dieser erweiterte Ansatz verwendet eine WITH-Klausel, um dies effizient zu handhaben:

WITH existing_rows AS (
    SELECT id
    FROM chats
    WHERE ("user", "contact") = ANY (SELECT ("user", "contact") FROM temp_table)
), inserted_rows AS (
    INSERT INTO chats ("user", "contact", "name")
    SELECT "user", "contact", "name"
    FROM temp_table
    ON CONFLICT ("user", "contact") DO NOTHING
    RETURNING id
)
SELECT id FROM existing_rows
UNION ALL
SELECT id FROM inserted_rows;
Nach dem Login kopieren

temp_table enthält die einzufügenden Daten.

Erklärung:

  1. existing_rows CTE: Dies wählt die ids bereits vorhandener Zeilen in der chats-Tabelle aus, die mit den ("user", "contact")-Paaren in temp_table übereinstimmen.

  2. inserted_rows CTE: Dies führt die INSERT-Anweisung mit ON CONFLICT DO NOTHING und RETURNING id aus und erfasst die ids neu eingefügter Zeilen.

  3. UNION ALL: Dies kombiniert die Ergebnisse beider CTEs und liefert eine vollständige Liste der ids, die von der Upsert-Operation betroffen sind.

Wichtige Überlegungen:

  • Gleichzeitigkeit: In Umgebungen mit hoher Parallelität können sich Daten zwischen den Vorgängen SELECT und INSERT ändern. Erwägen Sie die Verwendung von Transaktionen oder robusteren Mechanismen zur Parallelitätskontrolle für die Datenintegrität.
  • Datentypen: Stellen Sie sicher, dass die Datentypen in temp_table mit denen in der Tabelle chats übereinstimmen. Möglicherweise ist ein explizites Casting erforderlich.
  • Einzigartigkeit: Behalten Sie die Einzigartigkeit der Daten von temp_table bei (oder verwenden Sie eine eindeutige Kennung), um unbeabsichtigte Mehrfachaktualisierungen derselben Zeile zu vermeiden.

Diese verfeinerte Lösung bietet eine klarere und effizientere Methode zum Abrufen aller relevanten IDs während eines PostgreSQL-Upsert-Vorgangs mit Konfliktbehandlung.

Das obige ist der detaillierte Inhalt vonWie rufe ich IDs eingefügter und widersprüchlicher Zeilen mithilfe von PostgreSQLs ON CONFLICT ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage