sql >> Database teknologi >  >> RDS >> Mysql

SQL-standard UPSERT-kald

Den eneste løsning, der understøttes af både MySQL og HSQLDB, er at forespørge på de rækker, du har til hensigt at erstatte, og betinget enten INSERT eller UPDATE. Det betyder, at du skal skrive mere applikationskode for at kompensere for forskellene mellem RDBMS-implementeringer.

  1. START TRANSAKTIONEN.
  2. VÆLG ... TIL OPDATERING.
  3. Hvis SELECT finder rækker, så OPDATERE.
  4. Ellers, INDSÆT.
  5. KOMMITTERER.

MySQL understøtter ikke ANSI SQL MERGE-sætningen. Det understøtter REPLACE and INSERT...ON DUPLICATE KEY UPDATE. Se mit svar til " INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE" for mere om det.

Ad kommentarer:Ja, en anden tilgang er bare at prøve INSERT og se om det lykkes. Ellers lav en OPDATERING. Hvis du forsøger INSERT, og den rammer en dubletnøgle, vil den generere en fejl, som bliver til en undtagelse i nogle klientgrænseflader. Ulempen ved at gøre dette i MySQL er, at det genererer et nyt auto-increment ID, selvom INSERT mislykkes. Så du ender med huller. Jeg ved, at huller i den automatiske inkrement-sekvens ikke normalt er noget at bekymre sig om, men jeg hjalp en kunde sidste år, der havde mellemrum på 1000-1500 mellem vellykkede indsatser på grund af denne effekt, og resultatet var, at de udtømte rækkevidden af ​​en INT i deres primære nøgle.

Som @baraky siger, kunne man i stedet prøve OPDATERING først, og hvis det påvirker nul rækker, så gør INSERT i stedet. Min kommentar til denne strategi er, at OPDATERING af nul rækker ikke er en undtagelse -- du skal tjekke for "antal berørte rækker" efter OPDATERING for at vide, om det "lykkedes" eller ej.

Men at forespørge på antallet af berørte rækker returnerer dig til det oprindelige problem:du skal bruge forskellige forespørgsler i MySQL versus HSQLDB.

HSQLDB:

CALL DIAGNOSTICS(ROW_COUNT);

MySQL:

SELECT ROW_COUNT();


  1. MySQL sorterer på en beregning

  2. Få første dag i ugen i SQL Server

  3. Estimer datakomprimeringsbesparelser i SQL Server

  4. Eclipse - føj .jar til Dynamic Web Project