Jediným řešením, které je podporováno jak MySQL, tak HSQLDB, je dotaz na řádky, které chcete nahradit, a podmíněně buď INSERT nebo UPDATE. To znamená, že musíte napsat více kódu aplikace, abyste kompenzovali rozdíly mezi implementacemi RDBMS.
- ZAČNĚTE TRANSAKCI.
- VYBERTE... PRO AKTUALIZACI.
- Pokud SELECT najde řádky, pak UPDATE.
- Jinak, INSERT.
- ODPOVĚDIT.
MySQL nepodporuje příkaz ANSI SQL MERGE. Podporuje REPLACE a INSERT...ON DUPLICATE KEY UPDATE. Viz moje odpověď na " INSERT IGNORE“ vs. „INSERT... ON DUPLICATE KEY UPDATE“ více o tom.
Komentáře Re:Ano, další přístup je prostě zkusit INSERT a zjistit, zda uspěje. V opačném případě proveďte AKTUALIZACI. Pokud se pokusíte o INSERT a narazí na duplicitní klíč, vygeneruje se chyba, která se v některých klientských rozhraních změní ve výjimku. Nevýhodou tohoto provedení v MySQL je to, že generuje nové automatické zvýšení ID, i když INSERT selže. Takže skončíte s mezerami. Vím, že mezery v sekvenci automatického přírůstku nejsou obvykle důvodem k obavám, ale loni jsem pomohl zákazníkovi, který měl kvůli tomuto efektu mezery 1000–1500 mezi úspěšnými vložkami, a výsledkem bylo, že vyčerpali rozsah INT v jejich primárním klíči.
Jak říká @baraky, můžete se místo toho nejprve pokusit o UPDATE, a pokud to ovlivní nula řádků, místo toho proveďte INSERT. Můj komentář k této strategii je, že AKTUALIZACE nulových řádků není výjimkou – budete muset po UPDATE zkontrolovat „počet ovlivněných řádků“, abyste věděli, zda „uspěla“ nebo ne.
Ale dotazování na počet ovlivněných řádků vás vrátí k původnímu problému:musíte použít jiné dotazy v MySQL a HSQLDB.
HSQLDB:
CALL DIAGNOSTICS(ROW_COUNT);
MySQL:
SELECT ROW_COUNT();