在一个MySQL表中创build一个ID auto_increment(事实之后)

我从另一个开发者处获得了一个数据 他没有在任何表上使用auto_incrementers。 他们都有主键ID,但是他用代码手动完成了所有的增量操作。

我现在可以将其转换成Auto_incrementers吗?


哇,非常好,谢谢。 它在我的一张桌子上顺利运作。 但是第二个表,我得到这个错误…重命名'。\ DBNAME#sql-6c8_62259c'到'。\ DBNAME \ dealer_master_events'

例如,下面是一个具有主键但不是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 

请注意,您已经修改了列定义,无需创build第二列并删除原始列。 PRIMARY KEY约束不受影响,您不需要在ALTER TABLE语句中提及。

接下来,您可以testing插入是否会生成一个新值:

 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上testing了这个。

我还testing了ENGINE=InnoDB和一个依赖表。 修改id列定义不会中断参照完整性。


要回应您在评论中提到的错误150,可能是与外键约束冲突。 我的道歉,我testing后,我认为这将工作。 以下是一些可能有助于诊断问题的链接:

我猜你不需要重新增加现有的数据所以,为什么你不能只是运行一个简单的ALTER TABLE命令来改变PK的属性?

就像是:

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

我已经在我自己的MySQL数据库上testing了这个代码,它可以工作,但是我没有试过任何有意义的logging数。 一旦你改变了行,那么你需要将增量重置为一个数字,保证不会干扰任何其他logging。

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

再次,未经testing,但我相信它会奏效。

以上都没有为我的表工作。 我有一个无符号整数表作为主键,值从0到31543.目前有超过19000条logging。 我必须将列修改为AUTO_INCREMENTMODIFY COLUMN AUTO_INCREMENT = 31544 INTEGER UNSIGNED NOT NULL AUTO_INCREMENT ),并在同一语句中设置种子( AUTO_INCREMENT = 31544 )。

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

这工作对我来说(我想使ID主和设置自动增量)

ALTER TABLE table_name CHANGE id id INT PRIMARY KEY AUTO_INCREMENT;

是的,容易。 只需运行一个数据定义查询来更新表,添加一个AUTO_INCREMENT列。

如果您有一个现有的数据库,请注意保留“人工创build的”主键上可能已存在的任何外键关系。

只要你在当前PK中有唯一的整数(或者一些唯一的值),你可以创build一个新的表,并用IDENTITY INSERT ON插入它。 然后删除旧的表,并重新命名新的表。

不要忘记重新创build索引。