Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL-Standard-UPSERT-Aufruf

Die einzige Lösung, die sowohl von MySQL als auch von HSQLDB unterstützt wird, besteht darin, die Zeilen abzufragen, die Sie ersetzen möchten, und bedingt entweder INSERT oder UPDATE. Das bedeutet, dass Sie mehr Anwendungscode schreiben müssen, um die Unterschiede zwischen RDBMS-Implementierungen auszugleichen.

  1. TRANSAKTION STARTEN.
  2. WÄHLEN ... ZUR AKTUALISIERUNG.
  3. Wenn das SELECT Zeilen findet, dann UPDATE.
  4. Andernfalls EINFÜGEN.
  5. VERPFLICHTEN.

MySQL unterstützt die ANSI SQL MERGE-Anweisung nicht. Es unterstützt REPLACE und INSERT...ON DUPLICATE KEY UPDATE. Siehe meine Antwort auf " INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE" mehr dazu.

Zu Kommentaren:Ja, ein anderer Ansatz besteht darin, einfach das INSERT auszuprobieren und zu sehen, ob es erfolgreich ist. Andernfalls führe ein UPDATE durch. Wenn Sie die INSERT versuchen und eine doppelte Taste trifft, wird ein Fehler generiert, der in einigen Client-Schnittstellen zu einer Ausnahme führt. Der Nachteil dabei in MySQL ist, dass es eine neue Auto-Increment-ID generiert, selbst wenn das INSERT fehlschlägt. So enden Sie mit Lücken. Ich weiß, dass Lücken in der Auto-Increment-Sequenz normalerweise kein Grund zur Sorge sind, aber ich habe letztes Jahr einem Kunden geholfen, der aufgrund dieses Effekts Lücken von 1000-1500 zwischen erfolgreichen Einfügungen hatte, und das Ergebnis war, dass sie den Bereich von erschöpften INT in ihrem Primärschlüssel.

Wie @baraky sagt, könnte man stattdessen zuerst das UPDATE versuchen, und wenn dies null Zeilen betrifft, dann stattdessen das INSERT ausführen. Mein Kommentar zu dieser Strategie ist, dass das UPDATE von null Zeilen keine Ausnahme ist – Sie müssen nach dem UPDATE nach der „Anzahl der betroffenen Zeilen“ suchen, um zu wissen, ob es „erfolgreich“ war oder nicht.

Aber die Abfrage der Anzahl der betroffenen Zeilen bringt Sie zum ursprünglichen Problem zurück:Sie müssen unterschiedliche Abfragen in MySQL und HSQLDB verwenden.

HSQLDB:

CALL DIAGNOSTICS(ROW_COUNT);

MySQL:

SELECT ROW_COUNT();