Php MySQL重复条目错误,即使它不是重复条目
当我试图向表中添加一些特定数据时,出现了一个奇怪的错误。下面是我的MySQL命令Php MySQL重复条目错误,即使它不是重复条目,php,mysql,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;
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作为记录存在。但这与这个新条目无关。此表与其他表没有任何依赖关系
请让我知道是什么导致了这个问题,以及需要做什么来解决这个问题。提前感谢。数字定义为整数值,2147483647是有符号整数可以接受的最大值(最小值-2147483648)。我猜在create语句中缺少一个事实,即数字被定义为唯一键。您应该看看实际的表定义。你在这里提供的那个不能成为理由。插入后,数字将仅为2147483647,没有错误消息。数字定义为整数值,2147483647是有符号整数可以接受的最大值(最小值-2147483648)。我猜在create语句中缺少一个事实,即数字被定义为唯一键。您应该看看实际的表定义。你在这里提供的那个不能成为理由。插入后,数字将仅为2147483647,没有错误消息。是的,无符号整数可能仅从-2147483648到-2147483647(根据)。所以,它不可能是3522316712。是的,无符号INT可能只在-2147483648到-2147483647之间(根据数据)。所以,它不可能是3522316712。您的错误特别奇怪,因为您的代码片段没有指定编号是唯一的(并且您没有在其上显示唯一索引)。我认为这是一个疏忽,因为错误信息在这一点上非常清楚 发生的情况是,您正在为字段指定一个大于允许值的值。正如报告中所述: 当MySQL将一个值存储在 列数据类型的允许范围,结果取决于 当时有效的SQL模式:
- 如果启用了严格的SQL模式,MySQL将拒绝超出范围的值,并显示一个错误,并且插入失败,这与SQL模式一致 标准
- 如果未启用任何限制模式,MySQL会将值剪裁到范围的适当端点并存储结果值 相反
如果没有唯一的约束/索引,则每次插入的值太大时,值
2147483647
都会被放置在列中。您的错误特别奇怪,因为您的代码片段没有指定编号
是唯一的(并且您在其上没有显示唯一的索引)。我认为这是一个疏忽,因为错误信息在这一点上非常清楚
发生的情况是,您正在为字段指定一个大于允许值的值。正如报告中所述:
当MySQL将一个值存储在
列数据类型的允许范围,结果取决于
当时有效的SQL模式:
- 如果启用了严格的SQL模式,MySQL将拒绝超出范围的值,并显示一个错误,并且插入失败,这与SQL模式一致 标准
- 如果未启用任何限制模式,MySQL会将值剪裁到范围的适当端点并存储结果值 相反
如果您没有唯一的约束/索引,那么每次插入的值太大时,值
2147483647
都会放在列中。如果id
是您所说的主键,为什么这没有反映在CREATE
语句中?很明显,这里也没有PK,正如hellcode所指出的,如果您的应用程序允许非负密钥,那么您的主键可能应该是未签名的。如果id
如您所述是主键,为什么这没有反映在CREATE
语句中?很明显,这里也没有PK,正如hellcode所指出的,如果应用程序允许非负密钥,则主键可能应该是未签名的。不,不,int始终是int。它的大小为4字节。未签名的int从0到4294967295。您声明的范围是有符号整数。否,否,整数始终是整数。它的大小为4个字节。无符号整数的范围是从0到4294967295。您声明的范围是用于签名整数。谢谢!我将数据类型更改为BIGINT。谢谢!我将数据类型更改为BIGINT。谢谢。我将数据类型更改为BIGINT。谢谢。我将数据类型更改为BIGINT。