Heim >Datenbank >MySQL-Tutorial >Wie rufe ich IDs eingefügter und widersprüchlicher Zeilen mithilfe von PostgreSQLs ON CONFLICT ab?
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:
<code class="language-sql">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;</code>
temp_table
enthält die einzufügenden Daten.
Erklärung:
existing_rows
CTE: Dies wählt die id
s bereits vorhandener Zeilen in der chats
-Tabelle aus, die mit den ("user", "contact")
-Paaren in temp_table
übereinstimmen.
inserted_rows
CTE: Dies führt die INSERT
-Anweisung mit ON CONFLICT DO NOTHING
und RETURNING id
aus und erfasst die id
s neu eingefügter Zeilen.
UNION ALL
: Dies kombiniert die Ergebnisse beider CTEs und liefert eine vollständige Liste der id
s, die von der Upsert-Operation betroffen sind.
Wichtige Überlegungen:
SELECT
und INSERT
ändern. Erwägen Sie die Verwendung von Transaktionen oder robusteren Mechanismen zur Parallelitätskontrolle für die Datenintegrität.temp_table
mit denen in der Tabelle chats
übereinstimmen. Möglicherweise ist ein explizites Casting erforderlich.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!