例如,这里有一个主键但不是AUTO_INCREMENT 的表:
mysql> CREATE TABLE foo (
id INT NOT NULL,
PRIMARY KEY (id)
);
mysql> INSERT INTO foo VALUES (1), (2), (5);
您可以MODIFY 使用AUTO_INCREMENT 选项重新定义该列:
mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
验证是否生效:
mysql> SHOW CREATE TABLE foo;
输出:
CREATE TABLE foo (
`id` INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
请注意,您已就地修改了列定义,而无需创建第二列并删除原始列。 PRIMARY KEY 约束不受影响,您无需在 ALTER TABLE 语句中提及。
接下来您可以测试插入是否生成新值:
mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax
mysql> SELECT * FROM foo;
输出:
+----+
| id |
+----+
| 1 |
| 2 |
| 5 |
| 6 |
+----+
4 rows in set (0.00 sec)
我在 Mac OS X 上的 MySQL 5.0.51 上对此进行了测试。
我还使用ENGINE=InnoDB 和一个依赖表进行了测试。修改id 列定义不会中断引用完整性。
要回复您在评论中提到的错误 150,它可能与外键约束冲突。我很抱歉,在我测试它之后,我认为它会起作用。以下是一些可能有助于诊断问题的链接: