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

Posted

技术标签:

【中文标题】在 mysql 表 auto_increment 中创建一个 ID(事后)【英文标题】:make an ID in a mysql table auto_increment (after the fact) 【发布时间】:2010-09-20 01:42:31 【问题描述】:

我从另一个开发人员那里获得了一个数据库。他没有在任何表上使用 auto_incrementers。它们都有主键 ID,但他在代码中手动完成了所有递增操作。

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


哇,非常好,非常感谢。它在我的一张桌子上运行顺利。但是第二张表,我收到此错误...将 '.\DBNAME#sql-6c8_62259c' 重命名为 '.\DBNAME\dealer_master_events' 时出错

【问题讨论】:

【参考方案1】:

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

What does mysql error 1025 (HY000): Error on rename of './foo' (errorno: 150) mean? http://www.simplicidade.org/notes/archives/2008/03/mysql_errno_150.html

【讨论】:

哇,非常好,非常感谢。它在我的一张桌子上运行顺利。但是第二张表,我收到此错误...将“.\DBNAME\#sql-6c8_62259c”重命名为“.\DBNAME\dealer_master_events”时出错(错误号:150) 如果主键已经在其他地方充当外键,则需要在运行 alter table 查询之前禁用外键检查。 set foreign_key_checks = 0; ALTER TABLE buyer MODIFY COLUMN _id INT NOT NULL AUTO_INCREMENT; set foreign_key_checks = 1; @mugumedavid,这是不正确的。我刚试过。即使有从属表引用它,您也可以更改父表并使其主键 auto_increment。同样在另一个方向上,如果您想将 auto_increment 添加到也是 FK 的 PK(不知道为什么要这样做)。 @billkarwin 在我的情况下我真的失败了,这导致我进入这个页面和dba.stackexchange.com/questions/90162/… 这可能是我的数据库版本或 myIsam vs Innodb【参考方案2】:

我猜你不需要重新增加现有数据所以你为什么不能运行一个简单的 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

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

【讨论】:

我认为不需要第二个ALTER。而且我认为它会失败,因为语法需要“值”,而不是“表达式”。【参考方案3】:

以上都不适用于我的桌子。我有一个无符号整数作为主键的表,其值范围从 0 到 31543。目前有超过 19000 条记录。我不得不将列修改为AUTO_INCREMENT (MODIFY 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;

【讨论】:

这很关键,也是唯一对我有用的东西(MySQL 5.6/OSX)。如果您已经有一个 not 自动增量的主键并将其更改为自动增量,则您必须(至少在我的配置中,这是 100% 默认值)在同一语句中执行它们,否则插入不提供 ID 将失败,例如ERROR 1364 (HY000): Field 'id' doesn't have a default value.【参考方案4】:

这对我有用(我想将 id 设为主要并设置自动增量)

ALTER TABLE table_name CHANGE id id INT PRIMARY KEY AUTO_INCREMENT;

【讨论】:

【参考方案5】:
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 是另一个表中的外键,这些都不起作用:您将得到 ​​p>

an error 1068: Multiple primary key defined

为了解决这个问题,暂时禁用外键约束检查

set foreign_key_checks = 0;

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

set foreign_key_checks = 1;

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

该选项特定于 Microsoft SQL Server,与 MySQL 无关。

以上是关于在 mysql 表 auto_increment 中创建一个 ID(事后)的主要内容,如果未能解决你的问题,请参考以下文章

更新 MySQL 数据库中所有表的 AUTO_INCREMENT 值

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

(MYSQL) Auto_increment 基于另一个表的最大 id 的临时表?

SqlServer 使用 MySql 创建表,如 auto_increment 主键

MYSQL & innoDB 动态改变表的 AUTO_INCREMENT

MySQL auto_increment的坑