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

Hibernate @SQLInsert i na zduplikowanym kluczu

Poprawną odpowiedzią byłoby użycie następującego stwierdzenia:

INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY 
UPDATE colB = VALUES(colB);

Jednak pojawia się problem polegający na tym, że hibernacja nie otrzymała z powrotem wartości automatycznego przyrostu po wykonaniu instrukcji aktualizacji.

Znalazłem następujący post na blogu (http://www.jroller.com/mmatthews/entry/ uzyskiwanie_hibernacji_and_mysql_s ) i zmodyfikował zapytanie w następujący sposób:

INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY 
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);

co w końcu działa.

Nierozwiązywalnym problemem związanym z tym podejściem jest to, że wstawienie dwóch równych podmiotów w ramach tej samej transakcji nie działa. Nawet jeśli drugie wstawienie spowodowałoby poprawną aktualizację, em zakończyłby się z 2 instancjami encji reprezentującymi ten sam wiersz bazy danych - co jest niedozwolone.

Aby rozwiązać ten problem, wystarczy upewnić się, że nie wstawiasz 2 jednostek, które są renderowane jako równe ze względu na ich ograniczenia. (Użyłem tej samej logiki dla równości/hashcode, co ograniczenie złożonego klucza unikalnego, więc jestem w stanie wyeliminować takie duplikaty podczas wykonywania wstawek wsadowych)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapisz tablicę mysql php

  2. Pobieranie ostatniego wstawionego identyfikatora z wyrażeniem w mysql

  3. Jak sprawdzić, z której tabeli pochodzi wynik, gdy używasz UNION w MySQL?

  4. MySQL konwertuje moje wartości sygnatury czasowej na 0000-00-00

  5. PDO wstawia prostą tablicę do bazy danych MySQL