当我尝试向表中添加一些特定数据时,我遇到了一个奇怪的错误。以下是我的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作为记录存在。但它与这个新条目无关。该表与其他表没有任何依赖关系。
请让我知道导致此问题的原因以及需要采取哪些措施来解决此问题。提前谢谢。
答案 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。