2011-06-17 10 views
5

Mi tabla db se parece a esta imagen. http://prntscr.com/22z1nProblema con la columna "id" autoincrementada

Recientemente he creado la página delete.php. funciona correctamente, pero cuando eliminé el usuario número 21, el siguiente usuario registrado obtiene la identificación 24 en vez de 21.

¿Es posible poner la información de los usuarios recién registrados en la primera fila vacía? (En esta situación, la fila 21)

En mi formulario de registro, el usuario que acaba de registrarse puede escribir los nombres de los usuarios existentes y ser amigo de ellos después del registro. Para esta amistad, tengo otra tabla que asocia la identificación del usuario recién registrado y el usuario existente.

Para ello estoy usando mysql_insert_id durante el registro para obtener ID de usuario nuevo. Pero después de la eliminación de la fila 21 durante el proceso de registro de nex, mysql_insert_id me dio el número 21. pero se almacenó en la fila 24. Y poner en la tabla de asociaciones 21 para el nuevo usuario. Quiero resolver este problema

+0

Es posible que esté malinterpretando 'mysql_insert_id()'. Devuelve la ÚLTIMA id insertada. Llamarlo repetidamente siempre devolverá el último, nunca el siguiente. Su valor no cambiará hasta después de que se haya completado otro inserto. –

Respuesta

2

Una columna MySQL auto_increment mantiene un número internamente, y siempre lo incrementará, incluso después de las eliminaciones. Si necesita completar un espacio vacío, debe manejarlo usted mismo en PHP, en lugar de usar la palabra clave auto_increment en la definición de la tabla.

Retroceder para completar las identificaciones de filas vacías puede causar todo tipo de dificultades si tiene relaciones de claves foráneas para mantener, y realmente no se recomienda.

El auto_increment se puede restablecer utilizando una instrucción de SQL, pero esto no se recomienda porque causará errores clave duplicados.

-- Doing this will cause problems! 
ALTER table AUTO_INCREMENT=12345; 

EDITAR deben aplicarse las relaciones de clave externa como se describe en los comentarios, debe agregar a su definición de la tabla:

FOREIGN KEY (friendid) REFERENCES registration_table (id) ON DELETE SET NULL; 

completar los nombres de tablas y columnas correctas. Ahora, cuando un usuario se elimina del registro, se anula su asociación de amigos. Si necesita reasociarse con un usuario diferente, eso debe manejarse con PHP. mysql_insert_id() ya no es útil.

Si usted necesita encontrar el identificador de número más alto todavía en la base de datos después de la eliminación de asociarse con amigos, utilice la siguiente.

SELECT MAX(id) FROM registration_table; 
+0

¿puedo hacerlo con mysql_insert_id? –

+0

@Tural Teyyuboglu: mysql_insert_id() obtiene el id de la última inserción. Si incrementa y almacena ese valor, puede usarlo nuevamente para su próximo inserto. Aunque esto sería innecesario, porque ya conoce la identificación que utilizó durante la última inserción. –

+0

@Tural Teyyuboglu No, porque 'mysql_insert_id' solo recuperará la última ID utilizada. –

3

Cuando se utiliza una columna de incremento automático de identificación, el valor que se le asignará la siguiente entrada no se reducirá mediante la eliminación de una entrada. Para eso no se usa una columna de autoincrement. El motor de base de datos siempre incrementará ese número en una nueva inserción y nunca disminuirá ese número en una eliminación.

2

incremento automático es una secuencia de teclas que ha rastreado como parte de la mesa. No retrocede cuando elimina una fila.

+1

por favor, ayúdame a realizar mi idea –

1

Fácilmente, no. Lo que puede hacer (pero no sugiero hacerlo) es crear una función SQL para determinar el número más bajo que no está ocupado actualmente. O puede crear una tabla de ID que se eliminaron y obtener el menor número desde allí. O bien, y esta es la mejor idea, ignore las lagunas y descubra que la base de datos está bien.

1

Lo que se quiere hacer es alcanzable mediante la adición de una columna adicional a su mesa llamado algo así como user_order.A continuación, puede escribir código para administrar inserciones y eliminaciones, de modo que esta columna siempre sea secuencial y no tenga espacios vacíos.

De esta manera evitará los problemas que podría haber tenido con una columna auto_increment.

1

No es una buena práctica para restablecer el valor AUTO_INCREMENT, pero si realmente necesita hacerlo, para que pueda:

ALTER TABLE mytable AUTO_INCREMENT = 1; 

ejecutar esta consulta después de cada borrar. El valor de Auto_increment no se establecerá en 1, esto establecerá el valor más bajo posible automáticamente.

+1

¿por qué crees que es bueno bot? –

+0

@Tural, imaginemos que tiene table1 y table2. table2 tiene una tecla de avance para table1. Supongamos que elimina algo de la tabla 1 y luego agrega una nueva fila a la misma tabla. Entonces la nueva fila obtiene la misma identificación que la fila eliminada. Pero ahora podemos tener una situación cuando una fila en la tabla 2 apunta a nuestra nueva fila en la tabla1. Anteriormente, esta fila apuntaba a nuestra fila eliminada y ahora apunta a una nueva fila. Entonces, como pueden ver, esto está bien. – Karolis

+0

@Tural, lo siento, en mi última oración quise decir que esto NO está bien. Pero creo que entendiste :) – Karolis

Cuestiones relacionadas