Por exemplo, aqui está uma tabela que tem uma chave primária, mas não é
AUTO_INCREMENT
:mysql> CREATE TABLE foo (
id INT NOT NULL,
PRIMARY KEY (id)
);
mysql> INSERT INTO foo VALUES (1), (2), (5);
Você pode
MODIFY
a coluna para redefini-la com o AUTO_INCREMENT
opção:mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
Verifique se isso entrou em vigor:
mysql> SHOW CREATE TABLE foo;
Saídas:
CREATE TABLE foo (
`id` INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
Observe que você modificou a definição de coluna no local, sem precisar criar uma segunda coluna e descartar a coluna original. A
PRIMARY KEY
restrição não é afetada e você não precisa mencionar no ALTER TABLE
demonstração. Em seguida, você pode testar se uma inserção gera um novo valor:
mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax
mysql> SELECT * FROM foo;
Saídas:
+----+
| id |
+----+
| 1 |
| 2 |
| 5 |
| 6 |
+----+
4 rows in set (0.00 sec)
Eu testei isso no MySQL 5.0.51 no Mac OS X.
Também testei com
ENGINE=InnoDB
e uma tabela dependente. Modificando o id
definição de coluna não interrompe a integridade referencial. Para responder ao erro 150 que você mencionou em seu comentário, provavelmente é um conflito com as restrições de chave estrangeira. Peço desculpas, depois que testei achei que funcionaria. Aqui estão alguns links que podem ajudar a diagnosticar o problema:
- O que significa o erro mysql 1025 (HY000):Erro ao renomear './foo' (errorno:150)?
- http://www.simplicidade.org/notes/ archives/2008/03/mysql_errno_150.html