2008-10-30 13 views
51

Adquirí una base de datos de otro desarrollador. No usó auto_incrementers en ninguna tabla. Todos tienen ID de clave principal, pero hizo todo el incremento manualmente, en código.hacer una identificación en una tabla mysql auto_increment (después del hecho)

¿Puedo convertirlos en Auto_incrementers ahora?


Wow, muy agradable, gracias una tonelada. Funcionó sin problemas en una de mis mesas. Pero en una segunda tabla, obtengo este error ... Error al cambiar el nombre de '. \ DBNAME # sql-6c8_62259c' a '. \ DBNAME \ dealer_master_events'

Respuesta

96

Por ejemplo, he aquí una tabla que tiene una clave principal, pero no es AUTO_INCREMENT:

mysql> CREATE TABLE foo (
    id INT NOT NULL, 
    PRIMARY KEY (id) 
); 
mysql> INSERT INTO foo VALUES (1), (2), (5); 

Puede MODIFY la columna redefinirlo con la opción AUTO_INCREMENT:

mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT; 

Verifique esto tiene efecto:

mysql> SHOW CREATE TABLE foo; 

Salidas:

CREATE TABLE foo (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 

Nota que ha modificado la definición de columna en su lugar, sin necesidad de crear una segunda columna y dejando caer la columna original. La restricción PRIMARY KEY no se ve afectada, y no necesita mencionarla en la declaración ALTER TABLE.

A continuación se puede probar que una inserción genera un nuevo valor:

mysql> INSERT INTO foo() VALUES(); -- yes this is legal syntax 
mysql> SELECT * FROM foo; 

Salidas:

+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 5 | 
| 6 | 
+----+ 
4 rows in set (0.00 sec) 

He probado esto en MySQL 5.0.51 en Mac OS X.

I también probado con ENGINE=InnoDB y una tabla dependiente. La modificación de la definición de columna id no interrumpe la integridad referencial.


Para responder al error 150 que mencionas en tu comentario, probablemente sea un conflicto con las restricciones de la clave externa. Mis disculpas, después de haberlo probado, pensé que funcionaría. Aquí hay un par de enlaces que pueden ayudar a diagnosticar el problema:

+0

Guau, muy agradable, muchas gracias. Funcionó sin problemas en una de mis mesas. Pero en una segunda tabla, recibo este error ... Error al cambiar el nombre de '. \ DBNAME \ # sql-6c8_62259c' a '. \ DBNAME \ dealer_master_events' (errno: 150) –

+1

gracias aloat. me salvas. gracias –

+0

si la clave principal ya está actuando como una clave externa en otro lugar, deberá desactivar las comprobaciones de clave externa antes de ejecutar la consulta alter table. 'set foreign_key_checks = 0; ALTER TABLE buyer MODIFY COLUMN _id INT NOT NULL AUTO_INCREMENT; establecer foreign_key_checks = 1; ' –

-1

Siempre y cuando tenga enteros únicos (o algunos únicos) valor) en la PK actual, puede crear una nueva tabla e insertarla con IDENTITY INSERT ON. A continuación, suelte la tabla anterior y cambie el nombre de la nueva tabla.

No olvides volver a crear los índices.

+0

Esa opción es específica de Microsoft SQL Server y no tiene relevancia para MySQL. –

0

Sí, fácil. Simplemente ejecute una consulta de definición de datos para actualizar las tablas, agregando una columna AUTO_INCREMENT.

Si tiene una base de datos existente, tenga cuidado de preservar cualquier relación de clave externa que pueda existir en las claves primarias "creadas artificialmente".

4

Supongo que no necesita volver a aumentar los datos existentes, entonces, ¿por qué no puede simplemente ejecutar un simple comando ALTER TABLE para cambiar los atributos de PK?

Algo así como:

ALTER TABLE `content` CHANGE `id` `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT 

he probado este código en mi propia base de datos MySQL y funciona, pero no he probado con cualquier número significativo de registros. Una vez que haya alterado la fila, deberá restablecer el incremento en un número garantizado que no interfiera con ningún otro registro.

ALTER TABLE `content` auto_increment = MAX(`id`) + 1 

Nuevamente, aún no probado pero creo que funcionará.

4

Ninguna de las anteriores trabajó para mi mesa. Tengo una tabla con un entero sin signo como la clave principal con valores que van de 0 a 31543. Actualmente hay más de 19 mil registros. Tuve que modificar la columna a AUTO_INCREMENT (MODIFY COLUMN 'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT) y establecer la semilla (AUTO_INCREMENT = 31544) en la misma declaración.

ALTER TABLE `'TableName'` MODIFY COLUMN `'id'` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 31544; 
2

Esto funcionó para mí (que quería hacer primaria Identificación y establecer incremento automático)

ALTER TABLE table_name CAMBIO idid INT PRIMARIA AUTO_INCREMENT clave;

Cuestiones relacionadas