2010-09-15 11 views
6

Tengo una tabla con una clave primaria AUTO_INCREMENT. Si se elimina la última fila de la tabla, la siguiente fila insertada tendrá la misma ID.Detener MySQL Reutilizando AUTO_INCREMENT IDs

¿Hay alguna forma de que MySQL se comporte como t-SQL y no reutilice la ID? Luego, si se hace referencia errónea a la fila eliminada desde algo externo a la base de datos, no se devolverán filas, resaltando el error.

Respuesta

2

En este caso, probablemente no debería estar utilizando índices AUTO_INCREMENT en lugares accesibles al público.

O bien deriva un campo clave de otros datos, o utiliza un mecanismo diferente para crear tus id. Una forma que he usado anteriormente, aunque es necesario conocer las implicaciones de rendimiento (potencialmente graves), es una tabla de "claves" para rastrear la última clave utilizada e incrementarla.

De esta forma, puede usar cualquier tipo de clave que desee, incluso no numérica, y aumentarla usando su propio algoritmo.

He utilizado las teclas alfanuméricas de 6 caracteres en el pasado:

CREATE TABLE `TableKeys` (
    `table_name` VARCHAR(8) NOT NULL, 
    `last_key` VARCHAR(6) NOT NULL, 
    PRIMARY KEY (`table_name`) 
); 

SELECT * FROM `TableKeys`; 

table_name | last_key 
-----------+--------- 
users  | U00003A2 
articles | A000166D 
products | P000009G 
+0

En cualquier otro aspecto, AUTO_INCREMENT sirve mis propósitos, y mantiene las consultas de inserción simples. Creo que usaré el constructo "ALTER TABLE x AUTO_INCREMENT = y" para forzar la identidad hacia adelante en la eliminación. – Paul

1

Así no funcionan nuestras bases de datos MySQL, cuando se elimina un registro, el siguiente insertado tiene el siguiente número, no el que se eliminó.

+0

Creo que restablece cuando reinicie el PP. –

+3

InnoDB se reinicia cuando reinicia la base de datos. Cuando InnoDB se inicia, encuentra el incremento más alto y luego comienza desde allí. MyISAM almacena en caché el ID de incremento, por lo que esto no sucede. –

+0

En MySQL estoy usando (5.7.x), una vez que se elimina un registro con la clave más alta, el nuevo registro siguiente> inmediatamente Riva

1

Según tengo entendido, no hay forma de hacerlo. Puede pensar en solucionarlo agregando un marcador eliminado y luego estableciendo el indicador eliminado en lugar de eliminar la fila.

La respuesta "correcta" es que una vez que se elimina una fila, no debe hacer referencia a ella. Puede agregar claves externas para asegurarse de que el archivo db no permita que se borren las filas a las que se hace referencia en otro lugar en el archivo db.

+2

Lo siento, acabo de volver a leer su pregunta y veo que no está preocupado por otros elementos db que hacen referencia a la fila eliminada, sino que se hace referencia a ellos como "externos a la base de datos". Eso indicaría algo así como, tal vez, un usuario marque un enlace que incluya la identificación en la url, y luego, cuando reutilice ese marcador, en lugar de no obtener resultados, obtendrá los resultados incorrectos. En este caso, diría que la marca eliminada es probablemente la mejor manera de hacerlo, y cambie la lógica de presentación para mostrar un mensaje de usuario "eliminado" apropiado cuando se acceda a esos datos. –

+1

El problema con un indicador eliminado es que debe recordar utilizarlo como una restricción en cada consulta que accede a los datos (y hay muchos en mi caso), y luego considerar cualquier implicación de indexación – Paul

0

manual de MySQL says:

En este caso (cuando la columna AUTO_INCREMENT es parte de un índice de múltiples columnas), los valores AUTO_INCREMENT son reutilizados si se elimina la fila con el valor AUTO_INCREMENT más grande de cualquier grupo. Esto sucede incluso para las tablas MyISAM, para las cuales los valores AUTO_INCREMENT normalmente no se vuelven a utilizar.

Parece que hay un comportamiento como sea posible para los motores, que no sea MyISAM

Cuestiones relacionadas