Ver Mensaje Individual
  #3 (permalink)  
Antiguo 16/04/2008, 11:36
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Re: Empezar serial desde 1000

Primero, algunas breves aclaraciones; cambiar el auto_increment de una tabla, siempre que sea MyISAM, Memory o InnoDB posterior a 5.0.3, es posible, y fácil haciendo esto:
ALTER TABLE nombretabla AUTO_INCREMENT= 1000;
y ya está; naturalmente es posible hacer eso mismo nada más crear la tabla, y ya comenzará el autoincrementable desde 1000.

Una cosa distinta es lo que ha pedido Quimfv, un update de una tabla ya existente con datos y un id que no es el que quieres...

Hola, Quimfv,
hacer lo que pides es, creo, posible, pero yo solo lo he probado en tablas MyISAM. No sé lo que ocurrirá con las InnoDB y su control de borrado en cascada de los FK.

Para MyISAM, yo he dado los siguientes pasos (ni que decir tiene que esto con PHP o ASP también puede hacerse, pero estamos en el foro MySQL):

Para el caso de tablas MyISAM

1) Añadir un campo INT llamado por ejemplo idantiguo a la tabla t1, que tiene un campo id autoincrementable con índice primary key
ALTER TABLE t1 ADD idantiguo INT;

2) Copiar en ese campo el valor del id primary key, dato que se usará luego para los cambios en las tablas relacionadas.
UPDATE t1 SET idantiguo = id;

3) Copiamos la estructura de la tabla t1; quitamos el primary key; le añadimos un índice nuevo primary key y establecemos como autoincrement el número que queramos, por ej., el 1000. Y finalmente, copiamos los datos, campo por campo, excepto el id de t1.
CREATE TABLE t2 LIKE t1;
ALTER TABLE T2 DROP id
ALTER TABLE t2 ADD idt2 INT AUTO_INCREMENT PRIMARY KEY;
ALTER TABLE t2 auto_increment = 1000;
INSERT INTO t2 (campo1, campo2, campo3, idantiguo) SELECT campo1, campo2, campo3, idantiguo FROM t1;
En esa lista deben incluirse todos los campos de t1 menos id...

Ahora tenemos una tabla con un index primary key

4) trabajamos sobre las tablas relacionadas, concretamente la llamada t3, pero antes añadimos un índice al campo idantiguo de t2 para trabajar mejor con él...
ALTER TABLE t2 ADD INDEX ( `idantiguo` ) ;

UPDATE t3, t2 SET t3.refid = t2.idt2 WHERE t3.refid = t2.idantiguo

La parte del UPDATE habría que hacerla con todas las tablas que estuvieran relacionadas con el PK de t1 mediante un FK

5) borramos la tabla t1, eliminamos el campo idantiguo de t2, cambiamos el nombre a la tabla t2 llamándola ahora t1 y cambiamos el nombre del id para que sea como el primero que tuvo.
drop table t1;
drop table t2 idantiguo;
RENAME TABLE t2 TO t1;
ALTER TABLE t1 CHANGE `idt2` `id` INT( 11 ) NOT NULL AUTO_INCREMENT;

Y ya tenemos todos nuestros id en la tabla principal y sus relacionadas desde 1000, y las correspondencias entre PK y FK se mantienen, a pesar de los saltos que hubiera en el id de t1 al principio.

Pero mi pregunta, ¿y todo esto para qué, amigos?

Última edición por jurena; 16/04/2008 a las 13:02 Razón: añadir correcciones...