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

autoincrement sin saltar registro eliminado

Estas en el tema de autoincrement sin saltar registro eliminado en el foro de Bases de Datos General en Foros del Web. Hola a todos. He eliminado el último registro de una tabla y al insertar otro nuevo, el campo 'id' (autoincrement) da un salto. Es decir, ...
  #1 (permalink)  
Antiguo 27/04/2005, 05:33
Avatar de Mahalo  
Fecha de Ingreso: julio-2004
Ubicación: Mallorca (Illes Balears)
Mensajes: 1.121
Antigüedad: 19 años, 9 meses
Puntos: 12
autoincrement sin saltar registro eliminado

Hola a todos.
He eliminado el último registro de una tabla y al insertar otro nuevo, el campo 'id' (autoincrement) da un salto. Es decir, que he eliminado el id=28, y el siguiente que inserto lleva el 29. Yo quiero que lleve el 28. ¿Cómo puedo evitarlo sin tener que cambiarlo manualmente?
El código que uso es el más simple: int notnull autoincrement.
Un saludo y gracias.
  #2 (permalink)  
Antiguo 27/04/2005, 14:57
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
En la mayoría de lo motores no puedes.

MySQL trabaja de ambas formas. Si mal no recuerdo eso depende del tipo de tabla utilizada. InnoDB no te lo permite, mientras que ISAM o MyISAM si "reciclan" los numeros borrados.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 27/04/2005, 15:28
Avatar de Mahalo  
Fecha de Ingreso: julio-2004
Ubicación: Mallorca (Illes Balears)
Mensajes: 1.121
Antigüedad: 19 años, 9 meses
Puntos: 12
Pues la que uso es MyISAM. ¿Cómo hago para solucionar el problema?
Un saludo.
  #4 (permalink)  
Antiguo 27/04/2005, 15:33
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años
Puntos: 2
Hummm

Por el problema que mencionas comunmente nunca quieres borrar registros, siempre pones un STATUS que te dice que esta borrado, existen metodos complicados para solucionar esto, pero ya que estas usando MySql seria mas dificil mantener la seguridad de los datos, entonces te recomiendo poner el STATUS de borrado solamente.

Suerte!!
  #5 (permalink)  
Antiguo 28/04/2005, 01:38
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 8 meses
Puntos: 2
En mysql, la única forma de hacer que reutilice un valor (y sólo cuando se borra el último) es cuando se usa el auto_increment en un campo secundario de un índice formado por varios campos. En este caso, el cálculo del siguiente valor es "MAX(auto_increment_column)+1 WHERE prefix=given-prefix" (manual).
En cualquier otro caso, no hay forma de repetir número. Incluso, en las tablas innodb se pueden producir saltos aunque no se borren registros, si se hace un rollback de una transacción que implica a un campo auto_increment.
Un saludo.
__________________
Estoy contagiado de Generación-I
  #6 (permalink)  
Antiguo 28/04/2005, 01:58
Avatar de Mahalo  
Fecha de Ingreso: julio-2004
Ubicación: Mallorca (Illes Balears)
Mensajes: 1.121
Antigüedad: 19 años, 9 meses
Puntos: 12
Muchas gracias a todos. Saludos.
  #7 (permalink)  
Antiguo 28/04/2005, 11:06
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años
Puntos: 2
Si

Si Vice, como mencionas ese es un metodo, pero en MySql resulta dificil, bueno, no dificil, sino complicado, porque tienes que crear una secuencia como:

look table MAXID write
select max(ID) from MAXID
//Rutinas de insert en la tabla
update MAXID set ID = ID + 1
unlock table

Eso me parece complicado, y la verdad hasta ahorita no he encontrado una mejor manera para eso, esa estrucura la uso para muchas cosas, por ejemplo, recuperar el ultimo ID generado por un insert, se que existe mysql_query_id(), pero no es seguro ese metodo, se necesita algo como un TRANS de SQL Server, el cual asegura que una serie de instrucciones son atomicas.

En MySql es mas complicado.. y aprovecho, si alguien sabe como hacer este proceso de una manera mas segura, pues muchas gracias...

Desde PHP en resumen hago esto:

mysql_query("look table");
mysql_query("select max(ID) as ID from MAXID");
mysql_query("update MAXID set ID = ID + 1");
mysql_query("unlock table");

Entonces, bien ese seria mi metodo OJO - LA SINTAXIS NO ES LA CORRECTA< LO SE, ES SOLO UN EJEMPLO RAPIDO DE LA ESTRUCTURA

Entonces bueno, ese es el metodo mas seguro que he encontrado en MySql, sin embargo no puedo asegurar al 100% que funcione tal como yo quiero, si alquien conoce otro metodo mas seguro, pues bienvinido, gracias.
  #8 (permalink)  
Antiguo 02/05/2005, 01:02
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 8 meses
Puntos: 2
Fíjate Neuron, que en el ejemplo que tu pones no es el que yo indico. El caso que yo he expuesto implica que el campo autoincremental es secundario en un índice, es decir, que para buscar el maxid tendrías que hacer
select max(id) from tabla where campo=$valor
o, para ver todos los maxid (en este caso no hay uno para el camp, sino uno por grupo),
select campo, max(id) from tabla group by campo
donde campo sería el principal de un indice formado por "campo, id".
Es en este caso en el que el propio mysql realiza este cálculo de manera automática.

En cuanto a lo que indicas, si utilizas tablas innodb, en las que puedes realizar transacciones, se te solucionan los problemas que tú indicas.

De todas formas, ¿cuál es el problema?, ¿qué no exista ningún salto en la generación de los id de un campo?. Esto implica no borrar ningún registro, no sólo el último generado o, en su defecto, los borrados moverlos a otra tabla o marcarlos como borrados (borrado lógico, no físico). Esta es la única manera de no tener saltos en un campo secuencial.

Un saludo.
__________________
Estoy contagiado de Generación-I
  #9 (permalink)  
Antiguo 02/05/2005, 09:42
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años
Puntos: 2
Bien

Yo tambien prefiero borrado logico con status como mencione antes, sin embargo cuando si quieres tener el caso en MySql donde actualizas 2 tablas, como lo harias ???, cuando la segunda tabla depende de la primera, algo como:

1. insertar en tabla 1 y recuperar el ID creado.

2. insertar en tabla 2 el ID que recuperaste de la primera.

A eso me refiero, cuando 1 tabla depende de otra, o simplemente necesitas varias consultas en una sola tarea, con MySql ahorita en las versiones estables es muy dificil asegurar 100% la integridad de las bases de datos, entonces por eso menciono el metodo que utilizo:

mysql_query("look table");
mysql_query("insert tabla1 (1);
mysql_query("select maxID from tabla1");
mysql_query("select max2 from maxID");
mysql_query("unlock table");

Que es el unico modo que he encontrado de asegurar que las operaciones son correctas, pero bueno, como puedo lograr desde PHP hacer una operacion de esta forma hacia MySql que sea mas sencilla y mas segura, si existe otro metodo bienvienido, porque este metodo aun le veo muchas posibilidades de errores.
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 09:00.