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

Hibernate @SQLInsert og On Duplicate Key

Det rigtige svar ville være at bruge følgende udsagn:

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

Men så ser problemet ud til, at dvale ikke modtog en automatisk stigningsværdi tilbage, når opdateringssætningen er blevet udført.

Jeg fandt følgende blogindlæg (http://www.jroller.com/mmatthews/entry/ få_dvale_og_mysql_s ) og ændrede forespørgslen til følgende:

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

som endelig virker.

Et uløseligt problem med denne tilgang er, at indsættelsen af ​​to enheder, der er ens inden for samme transaktion, ikke virker. Selvom den anden indsættelse ville forårsage den korrekte opdatering, ville em'en ende med 2 entity-instanser, der repræsenterer den samme databaserække - hvilket ikke er tilladt.

For at løse dette skal man bare sikre sig, at du ikke indsætter 2 entiteter, som er gengivet lige på grund af deres begrænsninger. (Jeg brugte den samme logik for equals/hashcode som den sammensatte-unik-nøgle-begrænsning, så jeg er i stand til at eliminere sådanne dubletter, når jeg udfører batch-indsættelser)




  1. Mysql join giver duplikerede rækker

  2. Hvad og hvornår skal jeg angive setFetchSize()?

  3. Hvordan sammenkædes kolonner med Laravel 4 Eloquent?

  4. Hvordan viser man værdien af ​​en variabel på kommandolinjen i MySQL?