在一个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后,我认为这将工作。 以下是一些可能有助于诊断问题的链接:
- mysql错误1025(HY000):'./foo'(errorno:150)重命名错误是什么意思?
- http://www.simplicidade.org/notes/archives/2008/03/mysql_errno_150.html
我猜你不需要重新增加现有的数据所以,为什么你不能只是运行一个简单的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_INCREMENT
( MODIFY 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索引。