Den enda lösningen som stöds av både MySQL och HSQLDB är att fråga raderna du tänker ersätta, och villkorligt antingen INSERT eller UPDATE. Detta innebär att du måste skriva mer applikationskod för att kompensera för skillnaderna mellan RDBMS-implementeringar.
- STARTA TRANSAKTIONEN.
- VÄLJ ... FÖR UPPDATERING.
- Om SELECT hittar rader, UPPDATERA.
- Annars, INFOGA.
- ÅTGÄRDER.
MySQL stöder inte ANSI SQL MERGE-satsen. Den stöder REPLACE and INSERT...ON DUPLICATE KEY UPDATE. Se mitt svar på " INSERT IGNORE" kontra "INSERT ... ON DUPLICATE KEY UPDATE" för mer om det.
Angående kommentarer:Ja, ett annat tillvägagångssätt är att bara prova INSERT och se om det lyckas. Gör annars en UPPDATERING. Om du försöker INSERT och den träffar en dubblettnyckel, kommer det att generera ett fel, som förvandlas till ett undantag i vissa klientgränssnitt. Nackdelen med att göra detta i MySQL är att det genererar ett nytt auto-inkrement-ID även om INSERT misslyckas. Så du slutar med luckor. Jag vet att luckor i den automatiska ökningssekvensen vanligtvis inte är något att oroa sig för, men jag hjälpte en kund förra året som hade luckor på 1000-1500 mellan framgångsrika skär på grund av denna effekt, och resultatet var att de uttömde intervallet för en INT i sin primärnyckel.
Som @baraky säger, man kan istället försöka UPPDATERING först, och om det påverkar noll rader, gör då INSERT istället. Min kommentar till den här strategin är att UPPDATERING av nollrader inte är ett undantag -- du måste kontrollera "antal rader påverkade" efter UPPDATERING för att veta om det "lyckades" eller inte.
Men genom att fråga efter antalet rader som påverkas återgår du till det ursprungliga problemet:du måste använda olika frågor i MySQL jämfört med HSQLDB.
HSQLDB:
CALL DIAGNOSTICS(ROW_COUNT);
MySQL:
SELECT ROW_COUNT();