Demasiados incrementos automáticos con ON DUPLICATE KEY UPDATE

Tengo una tabla básica con columnas:

  • id (primario con AI)
  • nombre (único)
  • etc

Si la columna única no existe, INSERTE la fila, de lo contrario ACTUALIZA la fila ….

INSERT INTO pages (name, etc) VALUES 'bob', 'randomness' ON DUPLICATE KEY UPDATE name = VALUES(name), etc = VALUES(etc) 

El problema es que si realiza una ACTUALIZACIÓN, el valor auto_increment en la columna id aumenta. Entonces, si se realizan un montón de ACTUALIZACIONES, el id auto_increment se dispara.

Aparentemente era un error: http://bugs.mysql.com/bug.php?id=28781

… pero estoy usando InnoDB en mySQL 5.5.8 en alojamiento compartido.

Otras personas que tienen problemas sin solución hace años: evitar el autoincremento en el inserto duplicado MYSQL y ¿Por qué el aumento automático de MySQL aumenta en las inserciones fallidas?

Ideas en una solución? ¿He estructurado la base de datos incorrectamente de alguna manera?

****** EDIT ****: Parece que agregar innodb_autoinc_lock_mode = 0 a tu archivo my.ini corrige el problema, pero ¿qué opciones tengo para el alojamiento compartido?

****** EDIT 2 ******: OK, creo que mi única opción es cambiar a MyISAM como el motor de almacenamiento. Al ser un novato mega mySQL, espero que no cause muchos problemas. ¿Sí?

No creo que haya una forma de eludir este comportamiento de INSERT ... ON DUPLICTE KEY UPDATE .

Sin embargo, puede poner dos instrucciones, una UPDATE y una INSERT , en una transacción :

 START TRANSACTION ; UPDATE pages SET etc = 'randomness' WHERE name = 'bob' ; INSERT INTO pages (name, etc) SELECT 'bob' AS name , 'randomness' AS etc FROM dual WHERE NOT EXISTS ( SELECT * FROM pages p WHERE p.name = 'bob' ) ; COMMIT ; 

La funcionalidad de clave duplicada de MySQL es exactamente la misma que hacer dos consultas separadas, una para seleccionar, luego una para actualizar el registro seleccionado o insertar un nuevo registro. Hacerlo programáticamente es igual de rápido y evitará este problema en el futuro, además de hacer que su código sea más portátil.