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

Sospensione @SQLInsert e su chiave duplicata

La risposta corretta sarebbe usare la seguente affermazione:

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

Tuttavia, il problema sembra che l'ibernazione non abbia ricevuto un valore di incremento automatico, una volta eseguita l'istruzione di aggiornamento.

Ho trovato il seguente post sul blog (http://www.jroller.com/mmatthews/entry/ ottenere_ibernazione_e_mysql_s ) e ha modificato la query come segue:

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

che finalmente funziona.

Un problema irrisolvibile con questo approccio è che l'inserimento di due entità uguali all'interno della stessa transazione non funziona. Anche se il secondo inserimento causerebbe l'aggiornamento corretto, l'em finirebbe con 2 istanze di entità che rappresentano la stessa riga del database, il che non è consentito.

Per risolvere questo problema, è sufficiente assicurarsi di non inserire 2 entità rese uguali a causa dei loro vincoli. (Ho usato la stessa logica per equals/hashcode del vincolo composite-unique-key, quindi sono in grado di eliminare tali duplicati durante l'esecuzione di batch-insert)