Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL重复条目错误,即使它不是重复条目_Php_Mysql - Fatal编程技术网

Php 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;

当我试图向表中添加一些特定数据时,出现了一个奇怪的错误。下面是我的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作为记录存在。但这与这个新条目无关。此表与其他表没有任何依赖关系


请让我知道是什么导致了这个问题,以及需要做什么来解决这个问题。提前感谢。

数字定义为整数值,2147483647是有符号整数可以接受的最大值(最小值-2147483648)。我猜在create语句中缺少一个事实,即数字被定义为唯一键。您应该看看实际的表定义。你在这里提供的那个不能成为理由。插入后,数字将仅为2147483647,没有错误消息。

数字定义为整数值,2147483647是有符号整数可以接受的最大值(最小值-2147483648)。我猜在create语句中缺少一个事实,即数字被定义为唯一键。您应该看看实际的表定义。你在这里提供的那个不能成为理由。插入后,数字将仅为2147483647,没有错误消息。

是的,无符号整数可能仅从-2147483648到-2147483647(根据)。所以,它不可能是3522316712。

是的,无符号INT可能只在-2147483648到-2147483647之间(根据数据)。所以,它不可能是3522316712。

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

发生的情况是,您正在为字段指定一个大于允许值的值。正如报告中所述:

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

  • 如果启用了严格的SQL模式,MySQL将拒绝超出范围的值,并显示一个错误,并且插入失败,这与SQL模式一致 标准

  • 如果未启用任何限制模式,MySQL会将值剪裁到范围的适当端点并存储结果值 相反

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

因此,您的号码将被分配最大可能的值。如果您多次这样做,并且存在唯一的约束/索引,那么您将看到错误


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

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

发生的情况是,您正在为字段指定一个大于允许值的值。正如报告中所述:

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

  • 如果启用了严格的SQL模式,MySQL将拒绝超出范围的值,并显示一个错误,并且插入失败,这与SQL模式一致 标准

  • 如果未启用任何限制模式,MySQL会将值剪裁到范围的适当端点并存储结果值 相反

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

因此,您的号码将被分配最大可能的值。如果您多次这样做,并且存在唯一的约束/索引,那么您将看到错误


如果您没有唯一的约束/索引,那么每次插入的值太大时,值
2147483647
都会放在列中。

如果
id
是您所说的主键,为什么这没有反映在
CREATE
语句中?很明显,这里也没有PK,正如hellcode所指出的,如果您的应用程序允许非负密钥,那么您的主键可能应该是未签名的。如果
id
如您所述是主键,为什么这没有反映在
CREATE
语句中?很明显,这里也没有PK,正如hellcode所指出的,如果应用程序允许非负密钥,则主键可能应该是未签名的。不,不,int始终是int。它的大小为4字节。未签名的int从0到4294967295。您声明的范围是有符号整数。否,否,整数始终是整数。它的大小为4个字节。无符号整数的范围是从0到4294967295。您声明的范围是用于签名整数。谢谢!我将数据类型更改为BIGINT。谢谢!我将数据类型更改为BIGINT。谢谢。我将数据类型更改为BIGINT。谢谢。我将数据类型更改为BIGINT。