2010-02-18 32 views
11

tengo una columna llamada 'id' en una tabla mysql que también es una clave principal que se incrementa automáticamente.cómo reutilizar claves principales eliminadas en mysql?

cuando borro filas, también se eliminarán sus id, creando así "agujeros" en mi secuencia de identificación, por ej.

1, 2, 3, 9, 10, 30 y así sucesivamente

hay una manera de reutilizar estos Identificación del borrado: s?

+0

¿Por qué querrías hacer esto? –

+0

porque uso el 'id' como nombre para las filas (enlaces). así que no quiero estos nombres, por ejemplo, saltar de 5 a 23 dejando un gran hoyo entre ellos. – ajsie

+4

No use su identidad para esto. Asigne un nombre a sus filas durante la visualización, de esa forma separa el número de fila visual de la clave de base de datos interna. – Joe

Respuesta

10

Usando:

ALTER TABLE [your table name here] AUTO_INCREMENT = 1 

... se restablecerá el valor AUTO_INCREMENT para ser el próximo basado en el más alto valor existente existente en la tabla. Eso significa que no se puede usar para corregir las lagunas de más de uno.

La única razón para hacer esto sería para cosméticos: a la base de datos no le importa si los registros son secuenciales, solo que se relacionan entre sí consistentemente. No es necesario "corregir" los valores por el bien de la base de datos.

Si está mostrando los valores id al usuario, por lo que desea que siempre sean secuenciales, le recomiendo que agregue una clave sustituta. Utilice la clave sustituta para mostrar al usuario, de modo que los valores puedan ser secuenciados según sea necesario, pero la integridad referencial no se verá afectada. La clave sustituta en este caso sería una columna entera.

+0

Esto también puede ser útil en un entorno de prueba. – Michael

1

tiene dos opciones:

  1. especificar manualmente el ID (esto deja caer el auto del incremento automático)
  2. TRUNCATE la mesa - Esto eliminará todos los registros de la tabla

Siempre es una mala idea reutilizar los "agujeros" creados al eliminar filas, esto ya se ha respondido antes aquí en SO, pero ahora tengo demasiado sueño para ir a buscar esa pregunta.

+0

¿cómo podría especificar manualmente el ID más bajo? podrías mostrarme el código php para eso? – ajsie

+0

@noname: Como dije en mi respuesta, no debes hacer eso, los "agujeros" como te refieres existen para garantizar la integridad de los datos (relación), si no quieres tener vacíos en tu tabla estarás mejor estableciendo una columna de bandera 'deleted' en su tabla cuando quiere eliminar un registro en lugar de emitir realmente una instrucción SQL 'DELETE'. –

+0

uso id como nombre de enlace ... así que quiero que no tenga grandes saltos entre los números ... creo que enfermo especificar manualmente la identificación. – ajsie

1

Puedes probar 'ALTER TABLE t2 AUTO_INCREMENT = 1;'

+0

Funcionó para mí en MySQL 4.1, pero vea mi respuesta sobre su capacidad que podría no ajustarse al uso previsto. –

2

utilizar un script bash para cambiar el nombre de ellos (esto es increíblemente lento e ineficiente si usted tiene una gran base de datos) Luego, después de que haya terminado, como se dijo anteriormente utilizar ALTER TABLE para restablecer la clave junto a usarse

TARGET=1 
for KEYS in `mysql --skip-column-names -u root --password=Password -D lookup -e "select id from tbl"` ; do 
    mysql --skip-column-names -u root --password=Password -D lookup -e "update tbl set id='$TARGET' where id = '$KEYS'" 
    TARGET=`expr $TARGET + 1` 
    echo $TARGET 
done 
Cuestiones relacionadas