在MySQL表AUTO_CREATION中创建一个ID(在事实之后)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (50)

我从另一个开发人员那里获得了一个数据库。他没有用汽车_任何表上的增量器。它们都有主键ID,但他在代码中手动执行了所有递增操作。

我能把它们变成汽车吗?_现在是增量者?

提问于
用户回答回答于

例如,这里有一个具有主键但不是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)

我在MacOSX上的MySQL 5.0.51上测试了这个。

我也用ENGINE=InnoDB和一张相依的桌子。修改id列定义不会中断引用完整性。

用户回答回答于

我猜不需要重新增加现有的数据,那么,为什么不能运行一个简单的ALTERTABLE命令来更改PK的属性呢?

类似于:

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

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

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

再次,未经测试,但我相信它会奏效。

扫码关注云+社区