在 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 主键