¿Las claves primarias numéricas de los registros eliminados en una base de datos se reutilizan para nuevos registros futuros?

StackOverflow https://stackoverflow.com/questions/253522

Pregunta

Por ejemplo, si tengo un campo de numeración automática, agrego nuevos registros sin especificar este campo y dejo que el motor de DB lo elija por mí.
Entonces, ¿elegirá el número del registro eliminado? Si es así, ¿cuándo?

// SQL Server, MySQL. //

Pregunta de seguimiento: ¿Qué sucede cuando el motor de DB se queda sin números para usar con las claves principales?

¿Fue útil?

Solución

NO. las claves primarias numéricas no se reutilizarán, excepto que las especifique manualmente (¡realmente debería evitar esto!)

Otros consejos

AFAIK, este podría suceder en MySQL:

Cómo funciona AUTO_INCREMENT Handling in InnoDB :

  

InnoDB utiliza el contador de incremento automático en memoria mientras el servidor se ejecuta. Cuando el servidor se detiene y se reinicia, InnoDB reinicializa el contador de cada tabla para el primer INSERT en la tabla, como se describió anteriormente.

Después de reiniciar el servidor. Innodb reutiliza valores de auto_increment previamente generados. :

  

Solución sugerida:   La tabla innodb no debería perder la pista del siguiente número para la columna auto_increment después de   reiniciar.

Depende del sistema de numeración automática. Si está utilizando una secuencia de cualquier tipo, los números de registros eliminados no se reutilizarán, ya que la secuencia no los conoce.

En general, no, los números no se reutilizan.

Sin embargo, puede, en productos como Oracle, especificar un generador de secuencias que recorra y reutilice los números.

El problema de sus aplicaciones es si son números de registros eliminados o no.

Esta pregunta debe ser más precisa:

... " con secuencias de Oracle "

... " con las columnas de autonumeración de MySQL "

... etc ...

Mientras cree la tabla correctamente, no reutilizará los números. Sin embargo, puede RESERVAR la columna de identidad (de todos modos, EN MSSQL) utilizando lo siguiente:

: ingrese el número de la última entrada válida en la tabla, no el siguiente número que se usará

DBCC CHECKIDENT ([TableName], RESEED, [NumberYouWantToStartAt])

Por supuesto, esto es una locura ... y nunca se debe hacer :)

MySQL no reutilizará las ID a menos que trunque la tabla o elimine de la tabla sin la cláusula where (en cuyo caso MySQL, internamente , simplemente hace un truncado ).

No específicamente. Si la clave se está leyendo desde una secuencia o columna de identidad de autoincremento, la secuencia simplemente se conectará y generará el siguiente valor. Sin embargo, puede desactivar esto ( establecer identity_insert en en SQL Server) y colocar cualquier número que desee en la columna siempre que no viole la restricción de unicidad.

Sí, realmente depende de la forma en que generes la ID.

Por ejemplo, si está utilizando un GUID como clave principal, es probable que la mayoría de las implementaciones para obtener un Guid nuevo al azar no vuelvan a elegir otro guid, pero se le dará suficiente tiempo y si el Guid no está en la tabla, la inserción La declaración irá bien, pero si ya hay una guía allí, obtendrás una violación de la clave principal.

Considero la característica MySQL " " de reutilizar id es un error.

Considere algo como el procesamiento de archivos subidos. Utilizar el ID de la base de datos como un nombre de archivo es una buena práctica: simple, sin riesgo de explotaciones con los nombres de archivo proporcionados por el usuario, etc.

Realmente no puede hacer que todo sea transaccional cuando está involucrado el sistema de archivos ... tendrá que confirmar la transacción de la base de datos y luego escribir el archivo, o escribir el archivo y confirmar la transacción de la base de datos, pero si uno o ambos fallan, o tiene un fallo, o su sistema de archivos de red tiene un ajuste, podría tener un registro válido en la base de datos y ningún archivo, o un archivo sin un registro de base de datos, ya que la cosa no es atómica.

Si ocurre un problema de este tipo, y lo primero que hace el servidor cuando vuelve es sobreescribir los identificadores y, por lo tanto, los archivos de las transacciones retrotraídas, apesta. Esos archivos podrían haber sido útiles.

no, imagínese si su banco decidiera reutilizar su account_id - arghhhh !!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top