Problema con eliminar y la funcion mysql_fetch_array

gente tengo problema y duda con un codigo creado por mi, en mi tabla tengo un campo NoRegistro que es la llave principal y cada ves que inserto se inserta un numero que sigue al anterior a la hora de eliminar un registro me descuenta una todos los registros en ese campo para que sigan un orden logico pero con este codigo lo hace pero cuando pasa del registro Numero 10 se troca y empeisa a calcular mal, me aria falta que me dijeran si esxite algun valor de dato en Appserve que se autoincremente o autodecremente el mismo, sino por favor revizen el codigo y diganme por que hace esto de no calcular bien.

<?PHP
include "cconexion.php";
$conx=new conexion($baseDatos,$servidor,$usuario,$clave);
$conx->Conectar($baseDatos,$servidor,$usuario,$clave);
if ($eliminando>0) {
$aplicador="Delete from ingresos where NoRegistro='$eliminando'";
$aplicando = mysql_query($aplicador) or die(mysql_error());
$calc1=$eliminando+1;

$buscando="select * from ingresos where NoRegistro >='$calc1'";
$resulta= mysql_query($buscando) or die(mysql_error());
while ($row3=mysql_fetch_array($resulta))
        {   
$calc=$row3[NoRegistro]-1;
$Total="Update ingresos SET NoRegistro='$calc' where NoRegistro='$row3[NoRegistro]'";
$resultando = mysql_query($Total) or die(mysql_error());
  }
  }
  header("location:http://localhost/Ver.php");
?>

por favor responderme

Cuando haces un insert, puedes recoger el ID insertado con mysql_insert_id, quizá así puedes hacer un script que mantenga un orden lógico

Al hacer un insert, si omites en la consulta el campo clave, y éste tiene la opción de auto_increment, mysql debería hacerlo por ti, manteniendo siempre el id correcto.

espero que con estas notas te haya ayudado, un saludo!

Si borras un elemento, el campo AUTO_INCREMENT no es actualizado. El indice que tuviera ese elemento va a desaparecer. Es decir, si tienes (1,2,3,4,5) y borras la 4 y 5, tendras (1,2,3). Si metes un elemento, te quedará (1,2,3,6). Es asi tanto en MyISAM como en INNODB.
Segun MySQL:

MySQL escribió:

AUTO_INCREMENT values are reused if you delete the row with the biggest AUTO_INCREMENT value in any group. This happens even for MyISAM tables, for which AUTO_INCREMENT values normally are not reused.

Supongo que esto se aplica a campos que no son primary key, pero ahi ya no te puedo contar mucho mas.

Lo de que se comporta mal a partir del id 10, me suena a que te ocurre lo que te he comentado antes solo que tu borras registros posteriores al 10, como el 11, y por eso dices que te lo calcula mal.

Para solucionar esto, si es lo que digo, lo mejor es currarte un metodo de borrado que te actualice correctamente la key. ¿Por que no lo tiene MySQL? Pues supongo que por eficiencia. Al fin y al cabo da igual que tengas (12,13,18,19) que (12,13,14,15) a la hora de indexar elementos.

Socios ensegui sus consejo y hice un codigo para solucionar mi problema y el da alguno de ustedes si lo tienen algun dia aqui va pruebenlo

<?PHP

include "cconexion.php";
$conx=new conexion($baseDatos,$servidor,$usuario,$clave);
$conx->Conectar($baseDatos,$servidor,$usuario,$clave);
if ($eliminando>0) {
$aplicador="Delete from ingresos where NoRegistro='$eliminando'";
$aplicando = mysql_query($aplicador) or die(mysql_error());
$reduciendo=$eliminando-1;
$Ayuda="Select * from ingresos";
$Ayuda1=mysql_query($Ayuda) or die(mysql_error());
$row=mysql_num_rows($Ayuda1);
$calc=$row-$reduciendo;
for ($num=1; $num <=$calc; $num++){
$calc1=$eliminando+$num;
$calc2=$calc1-1;
$actualizar="Update ingresos SET NoRegistro='$calc2' where NoRegistro='$calc1'";
$actulizado= mysql_query($actualizar) or die(mysql_error());
}
}
header("location:http://localhost/Ver.php");
?>

No estaría de más que explicases, qué, dónde , toma el valor la variable $eliminando.

La alternativa a tu pregunta podría ser vaciando el registro en lugar de borrarlo, y, a la siguiente inserción, hacer un update sobre el primer registro vacio.

Un saludo. smile

Aslansh escribió:

Socios ensegui sus consejo y hice un codigo para solucionar mi problema y el da alguno de ustedes si lo tienen algun dia aqui va pruebenlo

<?PHP

include "cconexion.php";
$conx=new conexion($baseDatos,$servidor,$usuario,$clave);
$conx->Conectar($baseDatos,$servidor,$usuario,$clave);
if ($eliminando>0) {
$aplicador="Delete from ingresos where NoRegistro='$eliminando'";
$aplicando = mysql_query($aplicador) or die(mysql_error());
$reduciendo=$eliminando-1;
$Ayuda="Select * from ingresos";
$Ayuda1=mysql_query($Ayuda) or die(mysql_error());
$row=mysql_num_rows($Ayuda1);
$calc=$row-$reduciendo;
for ($num=1; $num <=$calc; $num++){
$calc1=$eliminando+$num;
$calc2=$calc1-1;
$actualizar="Update ingresos SET NoRegistro='$calc2' where NoRegistro='$calc1'";
$actulizado= mysql_query($actualizar) or die(mysql_error());
}
}
header("location:http://localhost/Ver.php");
?>

Solo una aclaración: la forma correcta de hacer una redirección es así:

header("Location: http://localhost/Ver.php");

Para que cumpla con el protocolo y no falle en ningún navegador.