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:
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) –
gracias aloat. me salvas. gracias –
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; ' –