sql >> Database >  >> RDS >> Mysql

Slaapstand @SQLInsert en op dubbele sleutel

Het juiste antwoord zou zijn om de volgende verklaring te gebruiken:

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

Maar dan blijkt het probleem dat de slaapstand geen auto-incrementwaarde terug heeft ontvangen, nadat de update-instructie is uitgevoerd.

Ik vond de volgende blogpost (http://www.jroller.com/mmatthews/entry/ get_hibernate_and_mysql_s ) en wijzigde de query in het volgende:

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

wat eindelijk werkt.

Een onoplosbaar probleem met deze benadering is dat het invoegen van twee entiteiten die gelijk zijn binnen dezelfde transactie niet werkt. Zelfs als de tweede invoeging de juiste update zou veroorzaken, zou de em eindigen met 2 entiteitsinstanties die dezelfde databaserij vertegenwoordigen - wat niet is toegestaan.

Om dit op te lossen, hoeft u alleen maar ervoor te zorgen dat u geen 2 entiteiten invoegt die vanwege hun beperkingen gelijk worden weergegeven. (Ik gebruikte dezelfde logica voor equals/hashcode als de samengestelde-unieke-sleutel beperking, dus ik ben in staat om dergelijke duplicaten te elimineren bij het uitvoeren van batch-inserts)




  1. Is het mogelijk om een ​​kolom te maken met een UNIX_TIMESTAMP standaard in MySQL?

  2. FOUT:toestemming geweigerd voor relatietabelnaam op Postgres tijdens het proberen van een SELECT als een alleen-lezen gebruiker

  3. PDO MySQL:voeg meerdere rijen in één query in

  4. Ontdek PL/SQL-types op pakketniveau met behulp van Oracle-woordenboekweergaven