例如,这是一个具有主键但不是的表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,这可能与外键约束冲突。我道歉,在测试之后,我认为它会起作用。这里有一些链接可能有助于诊断问题: