Ver Mensaje Individual
  #2 (permalink)  
Antiguo 18/12/2011, 07:45
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: problema con AUTO_INCREMENT

Disculpa, pero eso es razonamiento de programador... No debes razonar los problemas del modelo de datos como resuelves los asuntos de programación, porque los principios son distintos.
Primero: Una clave no es simplemente un índice numérico al azar. Es un identificador de objetos únicos, por lo que cambiar el ordenamiento o numeración de los objetos contenidos en la tabla tiene muchas más implicancias que solamente los números ordenados de la lista.
En ese sentido, tienes que considerar también que una clave primaria se usa para ordenamientos físicos de los registros, por lo que alterar su numeración implica también reordenar los registros en disco. Todos. ¿Tiene sentido esa tarea simplemente para que quede numéricamente bonito?
A esto tienes que sumarle que si esa clave (especialmente las primarias) se usa para establecer las relaciones entre tablas, no sólo tienes que cambiar la numeración en la tabla origen. Tendrás que hacerlo en todas las tablas donde se use ese valor de referencia. O sea, tiempo de proceso inútil y riesgo de errores de integridad.

Segundo: La idea, que puede parecer buena a nivel prorgamación, es una enorme pérdida de tiempo cuando trabajas en BBDD. De hecho, la misma existencia de ese campo "UID" simplemente para mantener una numeración consecutiva y solventar los "saltos" del autoincremental, es innecesaria, porque si lo que quieres es usar un número secuencial para mostrar en pantalla... no lo necesitas. Hay otras formas mucho más eficientes para eso. Incluso las puedes encontrar en las FAQs de este subforo.

Finalmente, si aún así insistes en hacer esto, tienes tres opciones: 1) Hacerlo programáticamente. 2) Hacerlo en una consulta UPDATE global donde el parámetro del WHERE sea igual o mayor al UID eliminado. 3) Usar un TRIGGER, con lo que sólo recargarás a la base con tareas que en el fondo no se necesitan.
Ninguna de las dos primeras es práctica si la tabla tiene muchos registros, por cuanto no sólo llevará mucho tiempo, sino que además generará bloqueos a los usuarios concurrentes. Y eso es una muy mala practica.
Siempre es preferible sacrificar las cosas "bonitas" en aras de la eficiencia de la base, y ese no es el caso que estás buscando. Tarde o temprano lo pagarás con performance.

Yo en realidad no usaría ninguna. Eliminaría ese campo inútil (yo ya experimenté el mismo caso, y finalmente careció de utilidad y practicidad) y usaría una solución dinámica que, como dije, puedes encontrar en las FAQs de MySQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)