2011-07-16 12 views
10

Tengo una galería de imágenes a la que los miembros del sitio web pueden cargar imágenes. Cuando se carga una imagen, se escribe una fila de MySQL que contiene varios datos sobre la imagen, el miembro, etc. Esta fila usa AUTO_INCREMENT para crear su ID, de modo que getimage.php?id=XX pueda recuperar la imagen que se mostrará.Cómo volver a asignar la columna AUTO_INCREMENT para cada fila en una tabla MySQL usando PHP

Extiendo los ID con un for-loop para mostrar las imágenes dentro de la galería.

Si borro la quinta fila/imagen, por ejemplo, AUTO_INCREMENT va de 123456789 a 12346789.

Me gustaría volver a asignar la ID a cada fila en la tabla MySQL, comenzando desde cero. Entonces 12346789 se convierte en 12345678. ¿Cómo lo lograría?

+4

Esto es totalmente la manera incorrecta de ir sobre el manejo de imágenes borradas. Simplemente seleccione las filas que necesita y recorra esas. –

+1

¿Por qué querrías hacer eso? También significa que tienes que actualizar todos los enlaces a esas imágenes para asegurarte de que sigas recibiendo las imágenes correctas. – Arjan

+1

Por lo que sé, no puede hacer eso si está usando el incremento automático de todos modos. – Matt

Respuesta

15

He encontrado que esto funcione perfectamente y bastante rápido, así que aquí está:

ALTER TABLE tablename DROP id 

ALTER TABLE tablename ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id), AUTO_INCREMENT=1 

Sé que esto no es el enfoque adecuado sin embargo para mi situación específica, esto es exactamente lo que se necesitaba. No hay nada dentro de la tabla que estaba usando que se refiera a una tabla o desde otra.

+0

¡Una solución sencilla, sencilla y sorprendente! ¿Te importa explicar por qué y cómo funciona? ¿Qué hace 'FIRST'? Ah, y yo recomendaría cambiar 'INT' a' INT UNSIGNED' ... – Domi

11

Si desea que el ID aumente automáticamente a siempre sea consecutivo, déjalo ir, es una lucha inútil.

Si lo que desea es volver a numerar una vez, eso es fácil:

crear una nueva tabla con la misma disposición:

CREATE TABLE mytable2 LIKE oldtable; 

Copiar todas las filas de la nueva tabla, recuerde no seleccione la auto_incrementing id; de lo contrario, se conservará la numeración anterior.

INSERT INTO mytable2 (field2, field3, field4) 
    SELECT field2, field3, field4 FROM oldtable ORDER BY oldtable.id; 

RENAME oldtable archive; 

RENAME mytable2 oldtable; 

DROP archive; 

Ahora tiene numeración consecutiva.

+0

Este es un buen enfoque. Es más seguro que la solución aceptada con tablas activas que puede tener otras actividades que agreguen a su tabla de acumulación. En cualquier caso, sin embargo, sería prudente envolver estos en una transacción no interrumpible, si hay mucha otra actividad. Y para esta solución, RENAME archivable viejotableable; sería mejor que DROP. Podrías soltarlo una vez que estés seguro de que todo funcionó. –

1

Como otros ya se ha dicho, este es un enfoque equivocado, pero en caso de que necesite volver a numerar (que es válido para la columna Ordenar por ejemplo), aquí es la consulta:

UPDATE tabaleName SET fieldName = fieldName - 1 WHERE fieldName > 5 ORDER BY fieldName ASC 

Y dado que está utilizando auto incremente, tiene que restablecerlo

ALTER TABLE tableName AUTO_INCREMENT=10000 

Pero, por favor, tenga en cuenta, publico esto solo con fines educativos. ¡Esto es el enfoque equivocado! En lugar de proporcionar el ID exacta en la consulta al hacer clic en siguiente/anterior, hacer

SELECT * FROM tableName WHERE fieldName > _the_previous_id_ 
ORDER BY fieldName ASC LIMIT 1 

O aún mejor, seleccionar todos los registros en el disco, y el bucle de ellos.

+0

observado dually. ¿Cómo haría un bucle en los registros de la tabla? – Drew

+0

ahh ok esto debería ser el truco SELECCIONAR * FROM tableName WHERE fieldName> _the_previous_id_ ORDER BY fieldName ASC LIMIT 1 es _the_previous_id_ ¿es esa una constante o la reemplazaría con mi variable $ id? – Drew

+0

Sí, es la variable $ id –

Cuestiones relacionadas