61

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

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


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

4

7 回答 7

113

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

于 2008-10-30T20:24:01.460 回答
5

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

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

于 2008-10-30T20:11:19.443 回答
5

以上都不适用于我的桌子。我有一个无符号整数作为主键的表,其值范围从 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;
于 2010-01-12T19:31:33.970 回答
2

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

ALTER TABLE table_nameCHANGE id idINT PRIMARY KEY AUTO_INCREMENT;

于 2014-02-21T21:34:00.430 回答
2
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;
于 2019-04-12T15:55:44.280 回答
0

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

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

于 2008-10-30T19:55:38.210 回答
-1

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

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

于 2008-10-30T19:54:40.927 回答