sql >> Databasteknik >  >> RDS >> Mysql

Viloläge @SQLInsert och On Duplicate Key

Rätt svar skulle vara att använda följande påstående:

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

Men då verkar problemet att viloläge inte fick tillbaka ett automatiskt ökningsvärde, när uppdateringssatsen har utförts.

Jag hittade följande blogginlägg (http://www.jroller.com/mmatthews/entry/ få_hibernate_and_mysql_s ) och ändrade frågan till följande:

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

som äntligen fungerar.

Ett olösligt problem med detta tillvägagångssätt är att införandet av två enheter som är lika inom samma transaktion inte fungerar. Även om den andra infogningen skulle orsaka korrekt uppdatering, skulle em:en sluta med 2 entitetsinstanser som representerar samma databasrad - vilket inte är tillåtet.

För att lösa detta behöver man bara se till att du inte infogar 2 enheter som renderas lika på grund av deras begränsningar. (Jag använde samma logik för equals/hashcode som begränsningen sammansatt-unik-nyckel, så jag kan eliminera sådana dubbletter när jag utför batch-infogningar)




  1. Pymysql Cursor.fetchall() / Fetchone() Returnerar ingen

  2. Grunder och användning av NOLOCK-tips i SQL Server

  3. Maximalt antal samtidiga anslutningar till MySQL

  4. Hur ser man om en användare är online på en webbplats med php- och mysql-drivna databaser?