Mysql错误号#1062解决办法

最近做新的HOJ的后台管理功能,实现一个简单的交互界面,能够让管理员方便地添加比赛。但是实际编码的时候发现一些数据库的问题:

  1. 存储比赛的表中,比赛的编号不是连续的。
  2. 比赛的编号不是自动增加的。
  3. 想要添加比赛,就要手动设置比赛的编号。

手动设置比赛的编号显然十分麻烦,不符合方便添加比赛的设计需求。那么就要把比赛编号字段设置成自动增加的。于是,输入了一条命令:

ALTER TABLE Contests CHANGE Contestid Contestid INT(11) NOT NULL AUTO_INCREMENT;

结果,我还是异想天开了——Mysql抛出了 #1062号错误:

ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1' for key 'PRIMARY'

仔细分析以后发现了出错原因。比赛的表(Contests)中原本是有数据的,比赛的编号是从0起递增的。修改Contestid字段到AUTO_INCREMENT时,Mysql尝试将Contestid=0的这行的Contestid修改成1,但是原表中已经存在了Contestid=1的项目,而对于主键Contestid来说,值应该是唯一的,所以会报错说出现重复值‘1’。那这样一来,该如何修改Contestid字段,使其变成自动增加的呢?

方法一:

找出了这么一个愚钝的方法,步骤如下:

  1. 导出Contests表中的数据到temp.sql文件。
  2. 删除Contests表中的所有数据。
  3. 修改Contestid字段为AUTO_INCREMENT。
  4. 导入temp.sql,完成。

方法二:

上面的方法显然很麻烦,而且如果数据量特别大的话,将会十分耗时。后来我又尝试了另一个方法:

  1. 修改Contestid为0的一行,使其Contestid为大于0的整数。当然不能和表中其他行的Contestid重复。
  2. 修改Contestid字段为AUTO_INCREMENT。
  3. 将步骤1中的那一行的Contestid改回0,完成。事后可能需要修改AUTO_INCREMENT记录。

这里假设Contests表和其他表没有关联。如果和其他表有关联,那么只要依照关联关系,利用上面的方法适当修改即可。

喜欢这篇文章?

欢迎订阅 PureWeber.com - 纯粹互联网。接收免费的更新提醒,以及订阅读者独家优质内容。

付建宇

加入讨论

电子邮件地址不会被公开。 必填项已用*标注