在mysql表auto_increment中创建一个ID(事后)

Gen*_*e R 58 mysql primary-key auto-increment

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

我现在可以把它们变成Auto_incrementers吗?


哇,非常好,谢谢你.它在我的一张桌子上毫无障碍地工作.但是第二个表,我收到此错误...将'.\ DBNAME#sql-6c8_62259c'重命名为'.\ DBNAME\dealer_master_events'时出错

Bil*_*win 106

例如,这是一个具有主键但不是的表AUTO_INCREMENT:

mysql> CREATE TABLE foo (
  id INT NOT NULL,
  PRIMARY KEY (id)
);
mysql> INSERT INTO foo VALUES (1), (2), (5);
Run Code Online (Sandbox Code Playgroud)

您可以MODIFY使用以下AUTO_INCREMENT选项重新定义列:

mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
Run Code Online (Sandbox Code Playgroud)

确认这已生效:

mysql> SHOW CREATE TABLE foo;
Run Code Online (Sandbox Code Playgroud)

输出:

CREATE TABLE foo (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)

请注意,您已经就地修改了列定义,而无需创建第二列并删除原始列.该PRIMARY KEY约束是不受影响的,你不需要提及的ALTER TABLE声明.

接下来,您可以测试插入是否生成新值:

mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax
mysql> SELECT * FROM foo;
Run Code Online (Sandbox Code Playgroud)

输出:

+----+
| id |
+----+
|  1 | 
|  2 | 
|  5 | 
|  6 | 
+----+
4 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

我在Mac OS X上的MySQL 5.0.51上测试了这个.

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


要响应您在评论中提到的错误150,它可能与外键约束冲突.我道歉,在我测试之后,我认为它会起作用.以下是一些可能有助于诊断问题的链接:

  • 如果主键已在其他地方充当外键,则需要在运行 alter table 查询之前禁用外键检查。`设置foreign_key_checks = 0; ALTER TABLE 买家修改列_id INT NOT NULL AUTO_INCRMENT; 设置foreign_key_checks = 1;` (2认同)

Ste*_*her 5

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

就像是:

ALTER TABLE `content` CHANGE `id` `id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT 
Run Code Online (Sandbox Code Playgroud)

我已经在我自己的 MySQL 数据库上测试了这段代码,它可以工作,但我没有尝试过任何有意义的记录数。更改行后,您需要将增量重置为保证不会干扰任何其他记录的数字。

ALTER TABLE `content` auto_increment = MAX(`id`) + 1
Run Code Online (Sandbox Code Playgroud)

同样,未经测试,但我相信它会起作用。


小智 5

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

ALTER TABLE `'TableName'` MODIFY COLUMN `'id'` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 31544;
Run Code Online (Sandbox Code Playgroud)