Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Empezar serial desde 1000

Estas en el tema de Empezar serial desde 1000 en el foro de Mysql en Foros del Web. Buenas Tengo una tabla que UNO de sus campos es serial (autoincremental). Me gustaria que mi serial empezara por una cantidad determinada, por ejemplo 1.000 ...
  #1 (permalink)  
Antiguo 15/04/2008, 22:32
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Empezar serial desde 1000

Buenas

Tengo una tabla que UNO de sus campos es serial (autoincremental).

Me gustaria que mi serial empezara por una cantidad determinada, por ejemplo 1.000 y no se como conseguirlo.

Trabajo con mysql

Gracias
  #2 (permalink)  
Antiguo 16/04/2008, 03:46
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Re: Empezar serial desde 1000

Mira estas respuestas http://www.forosdelweb.com/f86/conoc...rement-575804/

Pregunta al foro: es posible hacer un UPDATE a las tablas de metadatos para conseguir lo que pide neodani "Empezar serial desde 1000"?


Quim
  #3 (permalink)  
Antiguo 16/04/2008, 11:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
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...
  #4 (permalink)  
Antiguo 16/04/2008, 15:54
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Re: Empezar serial desde 1000

Gracias!

Me sirvio el

ALTER TABLE nombretabla AUTO_INCREMENT= 1000;

  #5 (permalink)  
Antiguo 17/04/2008, 01:12
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Re: Empezar serial desde 1000

Código:
ALTER TABLE nombretabla AUTO_INCREMENT= 1000;
Simple y elegante.

Jurena, gracias por las explicaciones, mi pregunta era solo por si no había una solución tan fácil como la que has dado, puesto que el post de neodani después de haber pasado por otro foro llevaba ahí días sin respuesta. Al ver que para conocer el próximo autoincrement se consultaba las tablas de meta datos se me ocurrió que igual se podía solucionar por la vía de hacer lo siguiente:

Código:
UPDATE `information_schema`.`tables` 
            SET AUTO_INCREMENT =1000 
   WHERE  TABLE_SCHEMA = "nombrebase" 
                 AND TABLE_NAME = "nombretabla";
Solo con ánimo de profundizar en el conocimiento, yo diría que ese ALTER TABLE lo que en realidad hace internamente es el UPDATE que yo sugería, puesto que si se aplica como sugiere, CORRECTAMENTE, jurena inmediatamente después de crear la tabla no puede guardar esa información en otro sitio que no sea en sus meta datos. No olvidemos que SQL es un lenguaje declarativo.

Quim
  #6 (permalink)  
Antiguo 17/04/2008, 01:31
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Re: Empezar serial desde 1000

Perdona, Quimfv,
te entendí mal y me dejé llevar por mis propias dudas sobre cómo cambiar el auto_increment cuando había tablas relacionadas y sin que ello produjera problemas en las relaciones (yo por ahora estoy con MyISAM).
Gracias, Quimfv
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:49.