sql >> Databáze >  >> RDS >> Mysql

Standardní SQL volání UPSERT

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.

  1. ZAČNĚTE TRANSAKCI.
  2. VYBERTE... PRO AKTUALIZACI.
  3. Pokud SELECT najde řádky, pak UPDATE.
  4. Jinak, INSERT.
  5. 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();


  1. Je jedinečný klíč SQL Server také index?

  2. Spousta stavů Query End v MySQL, všechna připojení použitá během několika minut

  3. Jak tiše nainstalovat Postgresql v Ubuntu přes. Dockerfile?

  4. mysql příliš mnoho indexů?