SQL - borrar registros y resetear auto_increment a la vez

 
Vista:
sin imagen de perfil

borrar registros y resetear auto_increment a la vez

Publicado por Alejandro (2 intervenciones) el 20/12/2016 14:30:33
Hola, tengo un problema...
He de hacer una funcion que me borre X entradas en una tabla de una base de datos y que a la vez me resetee el auto_incremen de esa tabla, al último registro borrado.

Creo que me he explicado pero pongo un ejemplo

Tabla clientes:

30 cliente Madrid
29 cliente Madrid
28 cliente Madrid
27 cliente Madrid
26 cliente Barcelona
25 cliente Barcelona
24 cliente Barcelona

En esta tabla quiero eliminar los clientes de Madrid y que la primera columna que es el auto_increment se resetee a 27 para que el próximo cliente añadido, sea el 27

Como puedo hacer eso de una manera sencilla? hay alguna forma de hacerlo en la misma sentencia sql?
Porque al ejecutar esa función, no sabré cuantos registros se borraran, ni por qué numero va el autoincrement.

PD: Lo voy a ejecutar desde PHP a MySQL.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 177
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

borrar registros y resetear auto_increment a la vez

Publicado por leonardo_josue (1172 intervenciones) el 20/12/2016 15:52:49
Hola Alejandro:

La pregunta aquí sería, ¿por qué razón necesitas "resetear" el auto_increment después de borrar algunos registros? Si la respuesta es para que no haya "brincos" y que la secuencia siempre esté completa, te puedo decir que es un terrible error Y NO DEBES HACERLO BAJO NINGUNA CIRCUNSTANCIA.

En realidad no tienes ningún beneficio en tener las secuencias completas, es exactamente lo mismo si hay brincos o no. Si por razones de "estética" o presentación necesitas numerar los registros, entonces hay otras formas de hacerlo sin necesidad de tenes que cambiar el valor del auto_increment...

Ahora bien, si hay una razón realmente de peso para que tengas que hacer lo que pides, te comento que tendrías que hacerlo por "pasos", primero determinar en qué número te quedaste (haciendo una consulta con MAX) y después utilizar un alter table para cambiar el valor del auto_increment:

http://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

borrar registros y resetear auto_increment a la vez

Publicado por Alejandro (2 intervenciones) el 20/12/2016 19:19:31
El problema es que ya estaba mal hecha cuando yo la cogí y el valor auto_increment, corresponde al numero de documento y no puedo dejarlos sin uso...

si hago un delete y después miro cual es el último registro de la base de datos, con resetear el auto_increment sumandole 1 mas, lo tendría verdad?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 177
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

borrar registros y resetear auto_increment a la vez

Publicado por leonardo_josue (1172 intervenciones) el 20/12/2016 22:18:00
Hola de Nuevo Alejandro...

La solución puede ser tan simple como lo que comentas o más complicada, dependiendo de tu lógica de negocio.

El que me digas que no puedes tener números de documento sin uso (lo que serían "brincos" en el auto_incremental), en realidad es una regla de negocio que debes aplicar aparte y que entonces NO TIENE NADA QUE VER CON UN CAMPO AUTO_INCREMENTAL...

Los campos AUTO_INCREMENTALES en MySQL funcionan como LLAVES, de tal suerte que si tienes LLAVES FORÁNEAS referenciadas a este campo, entonces debes tener cuidado si haces eliminaciones.... En tu ejemplo resulta que eliminas los últimos registros, de tal suerte que efectivamente, si haces un MAX + 1, el siguiente registro continuaría con la secuencia, pero ¿qué pasa si no se eliminan necesariamente los últimos registros? Supon un ejemplo así:

1
2
3
4
5
6
7
8
31 cliente Barcelona
30 cliente Madrid
29 cliente Madrid
28 cliente Madrid
27 cliente Madrid
26 cliente Barcelona
25 cliente Barcelona
24 cliente Barcelona

Imagina que tienes que eliminar todos los registros con atributo MADRID, de tal suerte que tu tabla entonces quedaría así:

1
2
3
4
31 cliente Barcelona
26 cliente Barcelona
25 cliente Barcelona
24 cliente Barcelona

Si haces un MAX + 1, entonces el siguiente consecutivo sería el 31, pero el problema de los brincos PERSISTE, porque ya no hay registros del 28 al 30. ¿Se entiende el problema?

Entonces, si fuera este el caso, el poner MAX + 1 NO ES LA SOLUCIÓN. el primer paso sería volver a NUMERAR la tabla RESULTANTE DESPUÉS DE LA ELIMINACIÓN, es decir, tendrías que tener algo así:

1
2
3
4
27 cliente Barcelona
26 cliente Barcelona
25 cliente Barcelona
24 cliente Barcelona

y entonces sí aplicar el MAX +1. Pero MUCHO OJO, aquí viene el problema que comentaba con las FK... si hay alguna otra tabla que haga referencia a este campo, en todas debes cambiar el 31 por 27, para que se conserve la integridad referencial... de lo contrario tu información será simplemente un montón de basura.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar