我从另一个开发人员那里获得了一个数据库。他没有在任何表上使用 auto_incrementers。它们都有主键 ID,但他在代码中手动完成了所有递增操作。
我现在可以把它们变成 Auto_incrementers 吗?
哇,非常好,非常感谢。它在我的一张桌子上运行顺利。但是第二张表,我收到此错误...将 '.\DBNAME#sql-6c8_62259c' 重命名为 '.\DBNAME\dealer_master_events' 时出错
我从另一个开发人员那里获得了一个数据库。他没有在任何表上使用 auto_incrementers。它们都有主键 ID,但他在代码中手动完成了所有递增操作。
我现在可以把它们变成 Auto_incrementers 吗?
哇,非常好,非常感谢。它在我的一张桌子上运行顺利。但是第二张表,我收到此错误...将 '.\DBNAME#sql-6c8_62259c' 重命名为 '.\DBNAME\dealer_master_events' 时出错
例如,这是一个具有主键但没有主键的表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,它可能与外键约束冲突。我很抱歉,在我测试它之后,我认为它会起作用。以下是一些可能有助于诊断问题的链接:
我猜您不需要重新增加现有数据,为什么您不能运行一个简单的 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
同样,未经测试,但我相信它会起作用。
以上都不适用于我的桌子。我有一个无符号整数作为主键的表,其值范围从 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;
这对我有用(我想让 id 成为主要并设置自动增量)
ALTER TABLE table_name
CHANGE id
id
INT PRIMARY KEY AUTO_INCREMENT;
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;
是的,很容易。只需运行数据定义查询来更新表,添加一个 AUTO_INCREMENT 列。
如果您有一个现有的数据库,请注意保留“人为创建的”主键上可能已经存在的任何外键关系。
只要您在当前 PK 中有唯一整数(或某些唯一值),您就可以创建一个新表,并使用 IDENTITY INSERT ON 插入其中。然后删除旧表,并重命名新表。
不要忘记重新创建任何索引。