Auto_increment PHP Y MYSQL

JuShTo

Buenas,

Tengo creado un bucle para ir añadiendo jornadas a una tabla en mysql mediante php.

Pero tengo un problema que no se solucionar, la primary key de la tabla la tengo puesta como auto_increment, hasta ahí todo bien, el problema es que si por ejemplo, creo 50 filas, luego las borro porque me apetece, al volver a ejecutar la consulta, la primary key me la establece en 51,52,53... en vez de ponerme 1,2,3...

¿Como puedo solucionarlo?

Describe de la tabla

Código de insercción de datos

<?php
$fin="2013-01-01";
$inicio="2012-12-01";
$equipos=10;
$dias=calc_diferencia_fechas($fin,$inicio);
$interjor=$dias/($equipos-1);

for ($i=1;$i<=$equipos-1;$i++)
{
	conectar("abrir");
	$jornada=date("Y-m-d",strtotime("$inicio + 3 day"));
	echo $jornada;
	$consulta=mysql_query("insert into jornada(fecha_jornada,idTorneo,num_jornada) values('$jornada',2,$i)");
	compru_conex($consulta);
	$inicio=date("Y-m-d",strtotime("$inicio + 3 day"));
	conectar("cerrar");
}


?>
xMarston

A ver, hay dos formas, haciendo un truncate a la tabla, borra todo y el auto increment empezará desde 0 y la otra es con un alter table.

El alter table sería algo así:

ALTER TABLE t2 AUTO_INCREMENT = value;
1 respuesta
Merkury

Venia da decirte lo de #2 pero, realmente lo de que el ID sea 1 o 50 tampoco debería resultar un problema.

A no ser que estés utilizando el ID como dato y no como un indice.

1 respuesta
xMarston

También tienes la opción de:

SELECT max(id) FROM table

Pero vamos, como dice #3 no creo que eso sea un problema si no es que es una práctica o algo que te exija eso.

1 respuesta
JuShTo

#4

Estaba pensando en hacer el max, porque el truncate no sé, no me gusta xD, me gusta verlo bien ordenadito. Cuestion de pijerias.

Muchas gracias :)

1 respuesta
Merkury

#5 El max? What?

1 respuesta
xMarston

#6 Supongo que dice lo de seleccionar el max(id) de la tabla.

eXtreM3

También puedes, dentro del bucle, añadir el campo ID en la consulta e insertarle el valor del $i del bucle. Así empezará desde el principio :P (esto solo lo puedes hacer cuando estés seguro que tiene que empezar desde el principio a insertar)

1 respuesta
JuShTo

#8

Por lo que tu dices no hago eso, porque no empieza siempre desde 0. El tema es que no sabía si había alguna forma de hacerlo sin el max(id).

Pensaba que se podía hacer de alguna manera que el sistema determinase cual es el ultimo id metido de forma automatica, no que si metos los datos, luego los borro actúa como si no los hubiera borrado.

#5 Si, me referia al max(id) sorry por no expresarme correctamente.

2 respuestas
Merkury

#9 No se yo a fin de cuentas, si tengo un id auto incremental en el fondo es para olvidarme XD (y creo que como yo, la mayoría).

1
BLZKZ

#9 y si borras alguno que hay en medio tienes que recalcular el id de los siguientes, y como tengas muchas filas puedes joder el acceso a la BBDD en 0'.

El aunto_increment está para lo que está. Lo que tú intentas hacer es algo que pensé yo, pero que no es ideal. Si quieres hacer eso, el auto_increment no es lo ideal.

2
Soltrac

Por favor....hay una diferencia muy grande entre MAX() y Auto_increment. No es cuestión de "olvidarse" o no, es cuestión de que un MAX() te va a bloquear la tabla durante la transacción, por lo que es más lento.

Además, un auto_increment, si haces un rollback durante la transacción o fallara, el contador se va a incrementar.

Por lo tanto, solo debes usar MAX() si es totalmente necesario que la numeración sea correlativa sí o sí, por ejemplo, en tickets, donde la ley marca que deben ser correlativos por cojones.

2
glolg

si quieres un dato "auto"-incrementable, que respete el número de registros te recomiendo que lo hagas mediante la aplicación externa o tirando de sql con la función COUNT() , subquerys y haces que el valor a incrementar sea $este++;

Eso si has de ir con cuidado, ya que si tienes 25 registros y eliminas el registro 16, el siguiente lo intentará insertar con el 25 de nuevo, ahí ya te montas el algoritmo a tus necesidades.

1 respuesta
BLZKZ

#13 si usas count no tendrás el valor, tendras que recalcular todos los valores cada vez que elimine uno.

Lo "ideal" sería un trigger que cada vez que elimine uno recalcule los valores, así luego sacando el máximo (o el último id de la tabla, o el count como te salga de la mondonga +1) tendrás el id siguiente.

En tal caso sigo viéndolo una aberración. Es lo menos óptimo que puedas tener ever.

Ahh por cierto si lo haces con triggers o funciones no hace falta ni que hagas $este++, lo puedes hacer todo por SQL, es más cómodo

1 respuesta
glolg

#14 :) sin duda la mejor opción.

Yo personalmente, aunque no tenga mucha experiencia en SQL y aun estoy aprendiendo, supongo que he dado con la solución menos experta y soy consciente de la aberración xD, no obstante sigue siendo una solución con menos "formación" por así decirlo.

Cabe decir que suelo leer atentamente tus post por estas zonas , aunque no pase mucho por la web en general, siempre va bien enterarse de los buenos posteos.

1 respuesta
BLZKZ

#15 no lo decía por ti (lo de la aberración) sino por la idea de #1 en lo que tiene que hacer, en cuestión de rendimiento xD

Obviamente cualquier solución que se de al problema que se plantea va a ser muy poco óptima, como Soltrac puede corroborar.

Yo lo pensé para un foro, para saber el número de cada post en un hilo, pero a la hora de plantear el recalcular la id al borrar una respuestá vi que eso no podía funcionar bien de ninguna de las maneras.

Ojo yo soy también novato en esto, pero vamos es simple lógica que como tengas que recalcular 1 dato en 10000 filas va a llevar su tiempo xD

1 respuesta
eXtreM3

#16 no se puede modificar el valor de la PK no?

1 respuesta
BLZKZ

#17 ahora mismo no te lo puedo asegurar, pero creo que sí mientras no cree inconsistencia (si has dicho que sea "en cascada" modificaría todas las FK que dependan de la PK), ni esté repetida.

Voy a probarlo ahora mismo

1 respuesta
eXtreM3

#18 en caso de que se pueda, hacer eso en una tabla con miles de registros es una locura.

2 respuestas
BLZKZ

#19 comprobado que se puede, me hiciste dudar no se por qué.

Como ya he dicho no es recomendable ni eficiente lo que quiere hacer #1 xD

elkaoD

#19 modificar una PK? Qué va. Como mucho tendría que recalcular el índice para esa PK lo cuál no suele tardar mucho (depende del índice, pero por lo general no.)

Y hacerlo en cascada pues depende de cuántos tengan como FK esa PK, cómo esté construído el índice de la tabla relacionada, etc.

Si te refieres a lo de #1, sí, eso no es recomendable nunca.

1 respuesta
JuShTo

#21

Por lo tanto, lo hago autoincrement, sudo de que la numeración esté ordenada y fuera porque efectivamente, me da exactamente igual que la pk de saltos en numeración...

Mas que nada es que he leido todo lo que me habeis puesto, y claro, al ser fk de otras cuatro tablas... juM!

Usuarios habituales

  • JuShTo
  • elkaoD
  • BLZKZ
  • eXtreM3
  • glolg
  • Merkury
  • xMarston