Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Reset Auto incremet

Estas en el tema de Reset Auto incremet en el foro de Mysql en Foros del Web. Hola Amigos del foro esta vez tengo una pequeniia inquietud y es que necesito la forma de darle un reset a un auto increment en ...
  #1 (permalink)  
Antiguo 22/05/2012, 13:37
 
Fecha de Ingreso: marzo-2012
Ubicación: Republica Dominicana
Mensajes: 51
Antigüedad: 12 años, 1 mes
Puntos: 3
Reset Auto incremet

Hola Amigos del foro esta vez tengo una pequeniia inquietud y es que necesito la forma de darle un reset a un auto increment en mysql

ejemplo grabo 2 registro que en el autoicremet serian el 1 y el 2
como hago para que al borrar estos registros cuando inserte uno nuevo el autoincrement sea 1 otra vez

Help me please :D
  #2 (permalink)  
Antiguo 22/05/2012, 13:56
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Reset Auto incremet

Hola Carmelo9:

¿Qué utilidad le vez a reiniciar un campo autoincremental? además de el hecho de tener tus llaves "ordenadas"

Muchas veces hemos platicado en este foro de lo inútil que es "jugar" con los campos autoincrementales, el que tengas tus id's como 1,2,3,4 es exactamente lo mismo a que los tengas como 10,23,45563,1234211. No hay diferencia en cuanto a performance, y si puedes tener problemas con integridad referencial, si no tienes un adecuado uso de llaves foráneas.

¿Quieres numerar de manera secuencial tus registros? bueno, hay técnicas y/o trucos que te pueden ayudar

Código MySQL:
Ver original
  1. SELECT t.*, @rownum := @rownum + 1 posicion
  2.   FROM TuTabla t, (SELECT @rownum := 0) r

Pero bueno, como esa no era la pregunta, para alterar el valor del campo autoincremental lo haces con

Código:
ALTER TABLE tu_tabla AUTO_INCREMENT = valor_inicial_del_campo
Checa este scrpit:

Código MySQL:
Ver original
  1.     -> descripcion varchar(5), primary key (id));
  2. Query OK, 0 rows affected (0.08 sec)
  3.  
  4. mysql> insert into tabla (descripcion) values ('uno'), ('dos'), ('tres');
  5. Query OK, 3 rows affected (0.02 sec)
  6. Records: 3  Duplicates: 0  Warnings: 0
  7.  
  8. mysql> select * from tabla;
  9. +----+-------------+
  10. | id | descripcion |
  11. +----+-------------+
  12. |  1 | uno         |
  13. |  2 | dos         |
  14. |  3 | tres        |
  15. +----+-------------+
  16. 3 rows in set (0.00 sec)
  17.  
  18. mysql> delete from tabla;
  19. Query OK, 3 rows affected (0.04 sec)
  20.  
  21. mysql> insert into tabla (descripcion) values ('uno');
  22. Query OK, 1 row affected (0.02 sec)
  23.  
  24. mysql> select * from tabla;
  25. +----+-------------+
  26. | id | descripcion |
  27. +----+-------------+
  28. |  4 | uno         |
  29. +----+-------------+
  30. 1 row in set (0.00 sec)
  31.  
  32. mysql> delete from tabla;
  33. Query OK, 1 row affected (0.02 sec)
  34.  
  35. mysql> alter table tabla auto_increment = 1;
  36. Query OK, 0 rows affected (0.26 sec)
  37. Records: 0  Duplicates: 0  Warnings: 0
  38.  
  39. mysql> insert into tabla (descripcion) values ('uno');
  40. Query OK, 1 row affected (0.02 sec)
  41.  
  42. mysql> select * from tabla;
  43. +----+-------------+
  44. | id | descripcion |
  45. +----+-------------+
  46. |  1 | uno         |
  47. +----+-------------+
  48. 1 row in set (0.00 sec)

Saludos
Leo.
  #3 (permalink)  
Antiguo 22/05/2012, 14:11
 
Fecha de Ingreso: marzo-2012
Ubicación: Republica Dominicana
Mensajes: 51
Antigüedad: 12 años, 1 mes
Puntos: 3
Respuesta: Reset Auto incremet

Gracias la verdad es que te agradesco que me digas que no es necesarioo y gracias por tomarte las molestia...

eh tenido dias intentando esto a ver si consigo explicarme...

quiero que antes de grabar un registro primero haga un recorrido entre los id y donde falte uno hay se grabe ese registro por ejemplo

1 registro
2 registro
4registro

ovbiamente falta el registro 3 hay alguna forma de poner el siguiente registro guardado en la posicion 3??
  #4 (permalink)  
Antiguo 22/05/2012, 14:39
Avatar de 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: Reset Auto incremet

Cita:
ovbiamente falta el registro 3 hay alguna forma de poner el siguiente registro guardado en la posicion 3
Estás confundiendo MySQL con Excel...
Los DBMS tienen su propia forma interna de manejar la posición física de los registros, que es invisible ("transparente" se dice) para los usuarios. Esto significa que al usuario no le debe importar cómo lo hace, sino que el resultado de la consulta sea el que el usuario espera.
El cómo manejan los DBMS la posición física no le debe interesar, porque está afectada por algoritmos que apuntan a una búsqueda eficiente, y no a un "ordenamiento", que en definitiva es meramente estético.
Por tanto, si lo que quieres es que los registros parezcan en pantalla ordenados de una determinada forma, y numerados secuencialmente, nada tiene que ver eso con su posición física en disco, ni tampoco te tiene por qué interesar cómo logra MySQL hacerlo, en tanto el resultado de la consulta cumpla con lo que te resulta útil.

Resumiendo: No pierdas tiempo tratando de "arreglar" lo que no está mal, y confecciona las consulta saputando a lo que quieres obtener. El cómo lo ahce es irrelevante.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 22/05/2012, 15:42
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Reset Auto incremet

Lo dije en el primer post y lo vuelvo a repetir en este... ¿qué diferencia encuentras en tener los id's como (1,2,3,4) o como (1,2,4,5)???

también gnzsoloyo lo dice claramente en su post... Eso es meramente estético

en todo caso, si insistes en hacer esto NO UTILICES CAMPOS AUTO INCREMENTALES... crea una regla de negocio para asignar el id de manera manual... aunque sigo pensando que es una verdadera pérdida de tiempo.

Saludos
Leo.
  #6 (permalink)  
Antiguo 23/05/2012, 04:39
 
Fecha de Ingreso: mayo-2012
Mensajes: 42
Antigüedad: 12 años
Puntos: 5
Respuesta: Reset Auto incremet

Hola carmelo9,

Aunque comparto opinión con leonardo_josue y gnzsoloyo, si te interesa por algo más hice algo parecido en este otro post.

http://www.forosdelweb.com/f86/actualizar-ids-991781/

¡Un saludo!

Última edición por davikt; 23/05/2012 a las 04:50
  #7 (permalink)  
Antiguo 23/05/2012, 09:13
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
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.
  #8 (permalink)  
Antiguo 23/05/2012, 11:15
 
Fecha de Ingreso: marzo-2012
Mensajes: 53
Antigüedad: 12 años, 1 mes
Puntos: 3
Respuesta: Reset Auto incremet

Hola Carmelo9. Estoy de acuerdo en las apreciaciones tecnicas brindadas por leonardo y gnzsoloyo.

Pero al igual que leonardo, insisto: ¿Por qué no detallas para qué lo quieres hacer?, ¿qué es lo que te puede obligar a hacerlo?.

¿Por qué no expones el caso en concreto?. ¿Es para un programa de contabilidad o inventarios?, o cualquier otro cuyo resultado de un query exija la ordenación (por estética), que pretendes.

Si explicas un poco más tu caso, yo podría explicar uno de inventarios que me sucedió hace poco tiempo y contiene similitud con lo que expones (ordenamiento).

No lo explico ahora, por temor a "gastar pólvora en zopilote".

Saludos.
  #9 (permalink)  
Antiguo 23/05/2012, 13:38
 
Fecha de Ingreso: marzo-2012
Ubicación: Republica Dominicana
Mensajes: 51
Antigüedad: 12 años, 1 mes
Puntos: 3
Respuesta: Reset Auto incremet

Imaginemos esto:

ID|EMPRESA|NOMBRE
1 1 Alan
2 2 Leonardo
3 3 davikt
4 10 falegria230349

el campo empresa tiene 2 formas si se le deja en blanco se agrega como autoincremet, pero si el usuario quiere puede poner el numero que guste..

pasa que el usuario borra la fila 2 entonces tengo esto en mi tabla

ID|EMPRESA|NOMBRE
1 1 Alan
3 3 davikt
4 10 falegria230349

como me puedo hacer para que cuando el usuario inserte otro registro tome la segunda posicion y que la columna empresa tome el valor "2" automaticamente...

Sorry si no consigo explicarme pero es que soy nuevo en esto de programacion y una persona me dio la oportunidad de desarrollarme, me contrato para crearle un sistema bastante estenso y me han surjido muchas dudas..
Agradesco muschisimo su ayuda..
Saludos a todos
  #10 (permalink)  
Antiguo 23/05/2012, 13:46
Avatar de 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: Reset Auto incremet

¿Y qué requerimiento funcional o regla de negocio te plantearon que especifique que un registro nuevo deba "intercalarse" entre otros ya existentes?
¿Cuál es el sentido funcional para eso? ¿Representa una necesidad específica por alguna razón?

Ten en cuenta que que el uso de esas claves normalmente es invisible a los usuarios, y en pantalla se numeran secuencialmente los registros qu se muestran, pero eso no tiene relación ni con el orden en disco, ni con el valore de las claves.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 23/05/2012, 13:47
 
Fecha de Ingreso: noviembre-2011
Mensajes: 9
Antigüedad: 12 años, 5 meses
Puntos: 1
Respuesta: Reset Auto incremet

Carmelo9:

Ya entendimos el problema, pero sigues sin contestar POR QUÉ TIENES QUE HACERLO ASI

¿Probaste cualquiera de las respuestas que te puse? si es así quiere decir que no te sirven... entonces ¿por qué no te sirven?

davikt te puso una alternativa para poder solucionar algo parecido y yo en mi último post te ofrezco otra alternativa que hace lo mismo pero de manera más sencilla... entonces??? ¿haz probado algo de lo que te hemos dicho que hagas?

Te hemos dicho todos los que hemos contestado que lo que pretendes hacer es completamente inútil, pero insistes en querer hacerlo... por lo tanto debes de tener una razón de peso muy importante para hacerlo. ¿cuál es esa razón?

Leo.
  #12 (permalink)  
Antiguo 23/05/2012, 14:03
 
Fecha de Ingreso: marzo-2012
Ubicación: Republica Dominicana
Mensajes: 51
Antigüedad: 12 años, 1 mes
Puntos: 3
Respuesta: Reset Auto incremet

GRACIASSS :D Ya lo hicee como me pusieron en los ejemplo el problema estaba en que yo estaba ciego en hacerlo de esa forma y no pense y porque lo queria asii Muchas Gracias de vdd ya lo resolvi tenia toda la semana en esO :D

Etiquetas: auto, registros, reset, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:57.