Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Standardowe wywołanie SQL UPSERT

Jedynym rozwiązaniem, które jest obsługiwane zarówno przez MySQL, jak i HSQLDB, jest zapytanie o wiersze, które zamierzasz zastąpić, i warunkowo INSERT lub UPDATE. Oznacza to, że musisz napisać więcej kodu aplikacji, aby zrekompensować różnice między implementacjami RDBMS.

  1. ROZPOCZNIJ TRANSAKCJĘ.
  2. WYBIERZ... DO AKTUALIZACJI.
  3. Jeśli SELECT znajdzie wiersze, AKTUALIZUJ.
  4. W przeciwnym razie WSTAW.
  5. POTWIERDZENIE.

MySQL nie obsługuje instrukcji ANSI SQL MERGE. Obsługuje REPLACE i INSERT...ON DUPLICATE KEY UPDATE. Zobacz moją odpowiedź na " WSTAWIĆ I IGNOROWAĆ” a „WSTAWIĆ... PRZY AKTUALIZACJI ZDUPLIKOWANEGO KLUCZY” więcej na ten temat.

Re komentarze:Tak, innym podejściem jest po prostu wypróbowanie INSERT i sprawdzenie, czy się powiedzie. W przeciwnym razie wykonaj UPDATE. Jeśli spróbujesz INSERT i trafi zduplikowany klucz, wygeneruje błąd, który zamienia się w wyjątek w niektórych interfejsach klienta. Wadą takiego działania w MySQL jest to, że generuje nowy identyfikator automatycznego przyrostu, nawet jeśli INSERT nie powiedzie się. Więc kończysz z lukami. Wiem, że przerwy w sekwencji auto-inkrementacji zwykle nie są czymś, o co należy się martwić, ale w zeszłym roku pomogłem klientowi, który miał przerwy 1000-1500 między udanymi wstawkami z powodu tego efektu, w wyniku czego wyczerpał zakres INT w ich kluczu podstawowym.

Jak mówi @baraky, można zamiast tego najpierw spróbować UPDATE, a jeśli ma to wpływ na zero wierszy, zamiast tego wykonaj INSERT. Mój komentarz na temat tej strategii jest taki, że AKTUALIZACJA zerowych wierszy nie jest wyjątkiem — będziesz musiał sprawdzić „liczbę wierszy, których to dotyczy” po AKTUALIZACJI, aby wiedzieć, czy się „udało”, czy nie.

Ale zapytanie o liczbę wierszy, których to dotyczy, prowadzi do pierwotnego problemu:musisz użyć różnych zapytań w MySQL w porównaniu z HSQLDB.

HSQLDB:

CALL DIAGNOSTICS(ROW_COUNT);

MySQL:

SELECT ROW_COUNT();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używasz warstwy bazy danych Django poza Django?

  2. Zapytanie mySQL zwracające identyfikator zasobu #5

  3. Sterownik MySQL ODBC 5.1 zwraca zły typ danych do ADODB

  4. Co to jest partycjonowanie MYSQL?

  5. MySQL Sortuj alfabetycznie, ale ignoruj ​​​​