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

Låser INSERT IGNORE tabellen, selvom den ignorerer indsættelsen?

Det afhænger af motoren - MyIsam og InnoDb opfører sig forskelligt.

For MyIsam-tabeller, hvis der allerede findes en post i tabellen (selvom den ikke er commited endnu), en almindelig INSERT af den samme post ( den samme unikke nøgle) i den anden session rapporterer en duplctate-nøglefejl - så INSERT IGNORE ignorerer bare fejlen og fortsæt videre.

På InnoDB-tabellen, hvis posten ikke er låst, vil den almindelige INSERT straks rapporter dubletnøglefejlen (INSERT IGNORE springer fejlen over og fortsætter).
Men hvis posten er låst af den anden session (for eksempel er posten indsat, men ikke begået endnu, eller posten er låst af en UPDATE eller DELETE eller SELECT FOR UPDATE kommandoen), vil INSERT-kommandoen "hænge" og vente, indtil den anden session fjerner låsen (ved COMMIT eller ROLLBACK). Så, hvis posten stadig eksisterer efter at have fjernet låsen, vil INSERT rapportere fejlen (INSERT IGNORE vil ignorere fejlen), men hvis posten ikke eksisterer, vil INSERT tilføje denne post til tabellen.

IGNORER søgeord siger bare "i tilfælde af fejl bare ignorer det og fortsæt", men det påvirker ikke låseadfærd.




  1. MySQL-forespørgsel for at få optælling pr. time

  2. Hent de sidste poster ved hjælp af GROUP BY

  3. SQL cast datetime

  4. Undgå denne almindelige fejl, når du udfører lagret procedure i MS Access