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+------+-------+-------------+
| id | orden | descripcion |
+------+-------+-------------+
| 1 | 1 | uno |
| 2 | 2 | dos |
| 3 | 3 | tres |
| 4 | 4 | cuatro |
+------+-------+-------------+
Query OK, 2 rows affected (0.01 sec)
+------+-------+-------------+
| id | orden | descripcion |
+------+-------+-------------+
| 2 | 2 | dos |
| 4 | 4 | cuatro |
+------+-------+-------------+
mysql> #Sin actualizar el ID, sólo calculando la columna de posición
mysql
> SELECT p.id
, @rownum
:= @rownum
+ 1 posicion
, p.descripcion
+------+----------+-------------+
| id | posicion | descripcion |
+------+----------+-------------+
| 2 | 1 | dos |
| 4 | 2 | cuatro |
+------+----------+-------------+
mysql> #Actualizando la columna id, pero sin necesidad de utilizar ciclos
-> SET p.orden
= @rownum
:= @rownum
+ 1; Query OK, 2 rows affected (0.03 sec)
+------+-------+-------------+
| id | orden | descripcion |
+------+-------+-------------+
| 2 | 1 | dos |
| 4 | 2 | cuatro |
+------+-------+-------------+
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.