Единственото решение, което се поддържа както от MySQL, така и от HSQLDB, е да се запитат редовете, които възнамерявате да замените, и условно INSERT или UPDATE. Това означава, че трябва да напишете повече код на приложението, за да компенсирате разликите между реализациите на RDBMS.
- ЗАПОЧНЕТЕ ТРАНЗАКЦИЯТА.
- ИЗБЕРЕТЕ... ЗА АКТУАЛИЗИРАНЕ.
- Ако SELECT намери редове, след това UPDATE.
- Иначе, INSERT.
- ЗАВЪРЖИ.
MySQL не поддържа оператора ANSI SQL MERGE. Поддържа ЗАМЕСТВАНЕ и ВМЪКВАНЕ... ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИКАТ КЛЮЧ. Вижте моя отговор на " INSERT IGNORE" срещу "INSERT ... ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИКАТ КЛЮЧ" за повече информация.
Re коментари:Да, друг подход е просто да опитате INSERT и да видите дали е успешен. В противен случай направете АКТУАЛИЗИРАНЕ. Ако опитате INSERT и той удари дублиран ключ, той ще генерира грешка, която се превръща в изключение в някои клиентски интерфейси. Недостатъкът на това в MySQL е, че генерира нов идентификатор за автоматично увеличение, дори ако INSERT не успее. Така че в крайна сметка ще получите пропуски. Знам, че пропуските в последователността на автоматично нарастване обикновено не са нещо, за което да се притеснявате, но помогнах на клиент миналата година, който имаше пропуски от 1000-1500 между успешните вмъквания поради този ефект и резултатът беше, че те изчерпаха обхвата на INT в техния първичен ключ.
Както казва @baraky, вместо това може да се опита първо да UPDATE и ако това засяга нула редове, тогава вместо това направете INSERT. Коментарът ми за тази стратегия е, че АКТУАЛИЗИРАНЕТО на нулеви редове не е изключение – ще трябва да проверите за „брой засегнати редове“ след АКТУАЛИЗИРАНЕТО, за да разберете дали е „успешно“ или не.
Но запитването на броя на засегнатите редове ви връща към първоначалния проблем:трябва да използвате различни заявки в MySQL спрямо HSQLDB.
HSQLDB:
CALL DIAGNOSTICS(ROW_COUNT);
MySQL:
SELECT ROW_COUNT();