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

问题描述 投票:58回答:7

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

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


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

mysql primary-key auto-increment
7个回答
105
投票

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


5
投票

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

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

4
投票

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

就像是:

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

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

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

再次,未经测试但我相信它会起作用。


2
投票

这对我有用(我想让id为primary并设置自动增量)

ALTER TABLE table_name CHANGE id id INT PRIMARY KEY AUTO_INCREMENT;


0
投票

是的,很容易。只需运行数据定义查询即可更新表,并添加AUTO_INCREMENT列。

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


0
投票
ALTER TABLE `foo` MODIFY COLUMN `bar_id` INT NOT NULL AUTO_INCREMENT;

要么

ALTER TABLE `foo` CHANGE `bar_id` `bar_id` INT UNSIGNED NOT NULL AUTO_INCREMENT;

但是如果你的bar_id是另一张桌子上的外键,这些都不会起作用:你会得到的

an error 1068: Multiple primary key defined

要解决此问题,请临时禁用外键约束检查

set foreign_key_checks = 0;

并在运行上述语句后,再次启用它们。

set foreign_key_checks = 1;

-1
投票

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

不要忘记重新创建任何索引。

© www.soinside.com 2019 - 2024. All rights reserved.