Ver Mensaje Individual
  #7 (permalink)  
Antiguo 23/05/2012, 09:13
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 18 años
Puntos: 447
Respuesta: Reset Auto incremet

Hola de nuevo:

Estuve analizando el post que comenta davikt y tengo que hacer algunas observaciones:

primero. hay que tener cuidado cuando se habla de cambiar los id's de cualquier tabla sobre todo por la integridad referencial que mencioné desde mi primer post. Si el id de la tabla que se está reordenando es llave foránea de otra tabla se debe tener cuidado de haber definido una actualización en CASCADA, en caso contrario perderás las referencias y tu BD se convertirá en un montón de basura.

Segundo, la manera que propone davikt, si bien es funcional, no es óptima, pues el uso de ciclos impactaría demasiado si se habla de tablas con una buena cantidad de registros...

A riesgo de parecer un necio insisto en saber por qué la necesidad de tener los id's de manera ordenada. Tal como lo dije en el primer post, existen maneras muy sencillas de numerar los registros, inclusive podrías optar por tener una columna para almacenar este 'id' ordenado, pero sin que este sea CAMPO LLAVE... este campo podrías actualizarlo cuantas veces desees SIN QUE SE VEA COMPROMETIDA LA INTEGRIDAD REFERENCIAL... y como supongo que van a seguir insistiendo en el tema, aquí les dejo un ejemplo para su consideración:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM pruebas;
  2. +------+-------+-------------+
  3. | id   | orden | descripcion |
  4. +------+-------+-------------+
  5. |    1 |     1 | uno         |
  6. |    2 |     2 | dos         |
  7. |    3 |     3 | tres        |
  8. |    4 |     4 | cuatro      |
  9. +------+-------+-------------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> DELETE FROM pruebas WHERE id IN (1, 3);
  13. Query OK, 2 rows affected (0.01 sec)
  14.  
  15. mysql> SELECT * FROM pruebas;
  16. +------+-------+-------------+
  17. | id   | orden | descripcion |
  18. +------+-------+-------------+
  19. |    2 |     2 | dos         |
  20. |    4 |     4 | cuatro      |
  21. +------+-------+-------------+
  22. 2 rows in set (0.00 sec)
  23.  
  24. mysql> #Sin actualizar el ID, sólo calculando la columna de posición
  25. mysql> SELECT p.id, @rownum := @rownum + 1 posicion, p.descripcion
  26.     -> FROM pruebas p, (SELECT @rownum := 0) r;
  27. +------+----------+-------------+
  28. | id   | posicion | descripcion |
  29. +------+----------+-------------+
  30. |    2 |        1 | dos         |
  31. |    4 |        2 | cuatro      |
  32. +------+----------+-------------+
  33. 2 rows in set (0.00 sec)
  34.  
  35. mysql> #Actualizando la columna id, pero sin necesidad de utilizar ciclos
  36. mysql> UPDATE pruebas p, (SELECT @rownum := 0) r
  37.     -> SET p.orden = @rownum := @rownum + 1;
  38. Query OK, 2 rows affected (0.03 sec)
  39. Rows matched: 2  Changed: 2  Warnings: 0
  40.  
  41. mysql> SELECT * FROM pruebas;
  42. +------+-------+-------------+
  43. | id   | orden | descripcion |
  44. +------+-------+-------------+
  45. |    2 |     1 | dos         |
  46. |    4 |     2 | cuatro      |
  47. +------+-------+-------------+
  48. 2 rows in set (0.00 sec)

Carmelo9 observa esta consulta:

Código:
mysql> SELECT p.id, @rownum := @rownum + 1 posicion, p.descripcion
    -> FROM pruebas p, (SELECT @rownum := 0) r;
es la misma que te propuse desde el primer post (me pregunto si la probaste ) esta te sirve para crear una nueva columna secuencial, sin necesidad de tener que alterar o cambiar los id's de tus tablas.

davikt, prueba esta sentencia:

Código:
mysql> UPDATE pruebas p, (SELECT @rownum := 0) r
    -> SET p.orden = @rownum := @rownum + 1;
Esta te permite actualizar un campo para "reordenar" los valores... es lo mismo que haces en tu SP, pero sin utilizar ciclos. Haz la prueba y nos comentas.

Saludos
Leo.