mysql - sirve - on duplicate key update sql server
Demasiados incrementos automáticos con ON DUPLICATE KEY UPDATE (2)
La funcionalidad de clave duplicada de MySQL es exactamente lo mismo que hacer dos consultas separadas, una para seleccionar y luego otra para actualizar el registro seleccionado o para insertar un nuevo registro. Hacerlo de manera programática 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.
Tengo una tabla básica con columnas:
- Identificación (primaria con IA)
- nombre (unico)
- etc
Si la columna única no existe, INSERTE la fila, de lo contrario, ACTUALICE 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 de auto_increment en la columna de identificación aumenta. Entonces, si se realizan un montón de ACTUALIZACIONES, el id auto_increment pasa por el techo.
Aparentemente fue un error: http://bugs.mysql.com/bug.php?id=28781
... pero estoy usando InnoDB en mySQL 5.5.8 en hosting compartido.
Otras personas que tienen problemas sin solución hace años: evitan el autoincremento en el inserto duplicado de MYSQL y ¿Por qué el autoincremento de MySQL aumenta en los inserciones fallidas?
Ideas en una solución? ¿He estructurado la base de datos incorrectamente de alguna manera?
****** EDITAR ****: parece que agregar innodb_autoinc_lock_mode = 0 a su archivo my.ini soluciona el problema, pero ¿qué opciones tengo para el alojamiento compartido?
****** EDIT 2 ******: OK, creo que mi única opción es cambiar a MyISAM como motor de almacenamiento. Siendo un mega novato en MySQL, espero que no cause muchos problemas. ¿Sí?
No creo que haya una manera de evitar este comportamiento de INSERT ... ON DUPLICTE KEY UPDATE
.
Sin embargo, puede poner dos declaraciones, una UPDATE
y una INSERT
, en una transaction :
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 ;