Ver Mensaje Individual
  #1 (permalink)  
Antiguo 30/11/2013, 21:40
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
APORTE: Reorganizar clave primaria auto_increment

Bueno, recientemente me tope con un problema (no muy complejo) pero que no encontre por ningun lado la solucion, y como creo que es algo que a todos al menos una vez le ha pasado, posteo como lo sulucione, seguramente hay otras formas, esta es la que se me ocurrio y funciono.

Problema: Tengo una tabla con datos, con un id autoincrementado con varios cientos de miles de registros, para un proyecto en particular solo nesesito una fraccion de estos, asi que copio la tabla y borro los que no se van a usar asi no ocupan lugar, entonces, quedan enormes bucotes en los id. como es para un proyecto nuevo no puedo dejarlo asi, seria muy precario, no obstante esta tabla se relaciona con otras(con caracteristicas similares) por lo que la reorganizacion tiene que mantener la integridad.

Solucion:
El ejemplo se basa en una tabla de provincias, que tiene vinculadas localidades mediante claves foraneas.

0-> Antes que nada, asegurarse que todas las tablas que dependan de la que se va a reorganizar, (en ente caso la de localidades) tengan un comportamiento CASCADE para las actualizaciones.

Código MySQL:
Ver original
  1. ALTER TABLE  `localidades`ADD FOREIGN KEY (  `id_provincia` ) REFERENCES  `bd`.`provincias` ( `id_provincia` ) ON DELETE CASCADE ON UPDATE CASCADE ;

1-> Crear un indice redundante sobre la clave primaria de la tabla a reorganizar. (Para "engañar" a las claves foraneas)

Código MySQL:
Ver original
  1. ALTER TABLE  `provincias` ADD INDEX (  `id_provincia` );

2-> Borrar el indice PRIMARY de la tabla.

Código MySQL:
Ver original 

3-> Quitar el AUTO_INCREMENT de la ex clave primaria

Código MySQL:
Ver original
  1. ALTER TABLE  `provincias` CHANGE  `id_provincia`  `id_provincia` SMALLINT( 5 ) UNSIGNED NOT NULL;

4-> Crear un campo auxiliar, con clave primaria y AUTO_INCREMENT

Código MySQL:
Ver original
  1. ALTER TABLE  `provincias` ADD  `id_aux` SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY AFTER  `id_provincia`;

5-> Actualizar los id originales.

Código MySQL:
Ver original
  1. UPDATE `provincias` SET `id_provincia` = `id_aux`;

6-> Borrar el campo auxiliar.

Código MySQL:
Ver original
  1. ALTER TABLE `provincias` DROP `id_aux`;

7-> Volver a agregar la clave primaria donde corresponde.

Código MySQL:
Ver original
  1. ALTER TABLE  `provincias` ADD PRIMARY KEY (  `id_provincia` );

8-> Agregar el autoincrementado.

Código MySQL:
Ver original
  1. ALTER TABLE  `provincias` CHANGE  `id_provincia`  `id_provincia` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT;

9-> Borrar el indice redundante

Código MySQL:
Ver original
  1. ALTER TABLE provincias DROP INDEX id_provincia;

10-> Si fuese el caso, se deveria devolver a las tablas dependientes el comportamiento a sus claves foraneas, cambiando el CASCADE por el que corresponda.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios