Tema: Reparar ID
Ver Mensaje Individual
  #4 (permalink)  
Antiguo 26/12/2007, 12:21
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 3 meses
Puntos: 2658
Re: Reparar ID

Si bien es cierto que los AUTO_INCREMENT son administrados directamente por MySQL, eso no quiere decir que no se puedan ingresar manualmente. De hecho si lo intentas, lo puedes hacer, en tanto no violes la consistencia de la clave o intentes superponer una clave ya existente.
Lo que sucede en esos casos es que pueden quedar "huecos" de numeración, porque MySQL usará el siguiente número de ID dispoinible inmediatamente mayor al último ID ingresado. Si del 45 saltaste al 63, el siguiente será el 64.

La solución es un poco a fuerza bruta:
- Elimina la condición de Primamry Key de ese campo.
- Elimina el campo.
- Crealo nuevamente.
- Asignale la condición de AUTO_INCREMENT y PRIMARY KEY.

Una vez hecho esto, lista la tabla y te encontrarás con el problema resuelto.

Cita:
USE TEST;
CREATE TABLE PRUEBA1(ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
DESCRIPCION CHAR(45));
INSERT INTO PRUEBA1(ID, DESCRIPCION) VALUES(1,'UNO'),(2,'UNO'),(4,'UNO'),(10,'UNO'),(11 ,'UNO'),(12,'UNO'),(95,'UNO');

+----+-------------+
| ID | DESCRIPCION |
+----+-------------+
| 1 | UNO |
| 2 | UNO |
| 4 | UNO |
| 10 | UNO |
| 11 | UNO |
| 12 | UNO |
| 95 | UNO |
+----+-------------+
7 rows in set (0.00 sec)

mysql> INSERT INTO PRUEBA1(DESCRIPCION) VALUES('DOS');
Query OK, 1 row affected (0.03 sec)

mysql> SELECT * FROM PRUEBA1;
+----+-------------+
| ID | DESCRIPCION |
+----+-------------+
| 1 | UNO |
| 2 | UNO |
| 4 | UNO |
| 10 | UNO |
| 11 | UNO |
| 12 | UNO |
| 95 | UNO |
| 96 | DOS |
+----+-------------+
8 rows in set (0.00 sec)

mysql> ALTER TABLE PRUEBA1 DROP COLUMN ID;
Query OK, 8 rows affected (0.24 sec)
Records: 8 Duplicates: 0 Warnings: 0

mysql> ALTER TABLE PRUEBA1 ADD COLUMN ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
;
Query OK, 8 rows affected (0.14 sec)
Records: 8 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM PRUEBA1;
+-------------+----+
| DESCRIPCION | ID |
+-------------+----+
| UNO | 1 |
| UNO | 2 |
| UNO | 3 |
| UNO | 4 |
| UNO | 5 |
| UNO | 6 |
| UNO | 7 |
| DOS | 8 |
+-------------+----+
8 rows in set (0.00 sec)
Tip: verifica el código de la aplicación que ingresa los datos. No debe saltearse numeración en un autoincremental. ALGO está haciendo mal.

Importante adición: Esto no se puede hacer si la clave primaria de la tabla es clave foránea en otra tabla.

Última edición por gnzsoloyo; 26/12/2007 a las 12:30