MySQL重复输入错误,即使它不是重复条目

时间:2014-11-22 17:22:15

标签: php mysql

当我尝试向表中添加一些特定数据时,我遇到了一个奇怪的错误。以下是我的MySQL命令。

CREATE TABLE IF NOT EXISTS `phonenumbers` (
`id` int(11) NOT NULL,
  `number` int(11) NOT NULL,
  `added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=latin1;


INSERT INTO `phonenumberverifier`.`phonenumbers` (`id`, `number`, `added`) VALUES (NULL, '3522316712', CURRENT_TIMESTAMP)

“id”是主键,添加的字段是当前时间戳。

以下是我得到的错误。

#1062 - Duplicate entry '2147483647' for key 'number'

请注意,数字值2147483647作为记录存在。但它与这个新条目无关。该表与其他表没有任何依赖关系。

请让我知道导致此问题的原因以及需要采取哪些措施来解决此问题。提前谢谢。

3 个答案:

答案 0 :(得分:3)

您的错误特别奇怪,因为您的代码段并未指定number是唯一的(并且您没有显示唯一索引)。我将假设这是一个疏忽,因为错误信息在这一点上非常清楚。

发生的事情是您分配的值大于允许进入该字段的值。正如documentation

中所述
  

当MySQL将值存储在数据列之外时   列数据类型的允许范围,结果取决于   当时有效的SQL模式:

     
      
  • 如果启用了严格的SQL模式,MySQL会根据SQL拒绝带有错误的超出范围的值,并且插入失败   标准。

  •   
  • 如果未启用限制模式,MySQL会将值剪辑到范围的相应端点并存储结果值   代替。

  •   
     

当为整数列分配超出范围的值时,MySQL   存储表示列的相应端点的值   数据类型范围。如果将256存储到TINYINT或TINYINT UNSIGNED中   在列中,MySQL分别存储127或255。

因此,您的号码将被分配最大可能值。如果您不止一次执行此操作,则会有一个唯一约束/索引,那么您将看到错误。

如果没有唯一约束/索引,则每次插入的值太大时,值2147483647将放在列中。

答案 1 :(得分:1)

数字定义为整数值,2147483647是有符号整数可以采用的最大值(最小值-2147483648)。我想在你的create语句中缺少这个数字被定义为唯一键。您应该看一下您的实际表定义。你在这提供的那个不是理由。插入后编号只是2147483647,没有错误信息。

答案 2 :(得分:-1)

是,无符号INT可能仅从-2147483648到-2147483647(根据this link)。所以,它不能是3522316712。