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

campo auto

Estas en el tema de campo auto en el foro de Mysql en Foros del Web. Buenas a todos. No se si Mysql tiene alguna propiedad asignada a un campo de una tabla para que además de que se autoincremente con ...
  #1 (permalink)  
Antiguo 16/04/2012, 05:39
Avatar de interjsr  
Fecha de Ingreso: octubre-2011
Ubicación: Madrid
Mensajes: 81
Antigüedad: 12 años, 6 meses
Puntos: 2
campo auto

Buenas a todos.
No se si Mysql tiene alguna propiedad asignada a un campo de una tabla para que además de que se autoincremente con respecto al anterior se decremente si se elimina. Es decir que si inserto un registro el id sea el máximo + 1 y si elimino 1 se reordene todos apartir del eliminado = -1.

Gracias
  #2 (permalink)  
Antiguo 16/04/2012, 10:05
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: campo auto

Hola interjsr:

Puedes asignarle a un campo INT la propiedad AUTO_INCREMENT, de tal manera que cada vez que se inserte un nuevo registro se asigne el siguiente valor definido para el contador, sin embargo, la parte de la eliminación no aplica, es decir, el campo AUTO_INCREMENT nunca se decrementa, independientemente de que se elimine el último registro. Sin embargo tengo que preguntarte ¿Qué beneficio te puede traer alterar el valor del campo autonumérico después de eliminar algún registro? Muchas veces hemos hablado en el foro de la insistencia de algunos desarrolladores de tener los id's de sus tablas de manera consecutiva, sin saltos, pero que esto NO ARROJA NINGÚN TIPO DE BENEFICIO, entonces insisto en preguntar por qué necesitas hacer lo que pretendes. Si la idea es numerar los registros, existen otras maneras para hacerlo...

Checa cualquiera de estas ligas:
http://craftycodeblog.com/2010/09/13...on-with-mysql/
http://forums.mysql.com/read.php?32,...665#msg-225665
http://www.artfulsoftware.com/infotree/queries.php

Ahora bien, volviendo a tu pregunta original, no existe una manera automática de hacer lo que quieres, aunque podrás implementar un trigger o un procedimiento almacenado para alterar el valor autoincrement. Checa este script:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla
  2.     -> descripcion VARCHAR(10), PRIMARY KEY (id));
  3. Query OK, 0 rows affected (0.13 sec)
  4.  
  5. mysql> INSERT INTO tabla VALUES
  6.     -> (NULL, 'uno'), (NULL, 'dos'), (NULL, 'tres');
  7. Query OK, 3 rows affected (0.06 sec)
  8. Records: 3  Duplicates: 0  Warnings: 0
  9.  
  10. mysql> SELECT * FROM tabla;
  11. +----+-------------+
  12. | id | descripcion |
  13. +----+-------------+
  14. |  1 | uno         |
  15. |  2 | dos         |
  16. |  3 | tres        |
  17. +----+-------------+
  18. 3 rows in set (0.00 sec)
  19.  
  20. mysql> DELETE FROM tabla WHERE id = 3;
  21. Query OK, 1 row affected (0.08 sec)
  22.  
  23. mysql> SELECT * FROM tabla;
  24. +----+-------------+
  25. | id | descripcion |
  26. +----+-------------+
  27. |  1 | uno         |
  28. |  2 | dos         |
  29. +----+-------------+
  30. 2 rows in set (0.00 sec)
  31.  
  32. mysql> INSERT INTO tabla VALUES (NULL, 'tres');
  33. Query OK, 1 row affected (0.08 sec)
  34.  
  35. mysql> SELECT * FROM tabla;
  36. +----+-------------+
  37. | id | descripcion |
  38. +----+-------------+
  39. |  1 | uno         |
  40. |  2 | dos         |
  41. |  4 | tres        |
  42. +----+-------------+
  43. 3 rows in set (0.00 sec)
  44.  
  45. mysql> DELETE FROM tabla WHERE id = 4;
  46. Query OK, 1 row affected (0.13 sec)
  47.  
  48. mysql> SELECT * FROM tabla;
  49. +----+-------------+
  50. | id | descripcion |
  51. +----+-------------+
  52. |  1 | uno         |
  53. |  2 | dos         |
  54. +----+-------------+
  55. 2 rows in set (0.00 sec)
  56.  
  57. mysql> ALTER TABLE tabla AUTO_INCREMENT=3;
  58. Query OK, 2 rows affected (0.48 sec)
  59. Records: 2  Duplicates: 0  Warnings: 0
  60.  
  61. mysql> INSERT INTO tabla VALUES (NULL, 'tres');
  62. Query OK, 1 row affected (0.11 sec)
  63.  
  64. mysql> SELECT * FROM tabla;
  65. +----+-------------+
  66. | id | descripcion |
  67. +----+-------------+
  68. |  1 | uno         |
  69. |  2 | dos         |
  70. |  3 | tres        |
  71. +----+-------------+
  72. 3 rows in set (0.00 sec)

Aquí se muestra en primer lugar la problemática que comento al inicio. Después de eliminar el último registro (id=3), al insertarlo nuevamente le asigna el id=4, independientemente de que el id=3 esté disponible. Esto ocasiona un "salto" en la secuencia. Para "corregir" este comportamiento puedes hacer un ALTER TABLE a la tabla... aunque ESTO NO ES RECOMENDABLE EN ABSOLUTO. Además esto aplicaría sólo cuando se elimina el último de los id's... si se elimina un registro intermedio entonces YA NO APLICARÍA ESTA SOLUCIÓN. Lo que pretendes de reordenar a partir del registro eliminado todos los siguientes es una barbaridad, ya que no solo tendrías que cambiar los id's de esa tabla SINO LOS ID'S DE TODAS LAS TABLAS RELACIONADAS, trabajo que insisto NO TE TRAE NINGÚN BENEFICIO.

Dale un vistazo y nos comentas
Saludos
Leo.

Etiquetas: auto, sql, tabla, campos
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 04:44.