没有重复值时出现重复键条目

4

当没有任何值相同时,我遇到了一个非常奇怪的重复条目错误...

INSERT INTO offer_status (id,user_id,sql_id,disabled) 
VALUES ('8854011812','8854','11812','0')

返回:

#1062 - 主键“PRIMARY”重复输入“2147483647”

这对我来说完全没有意义!

注意:通常不会执行此代码,我只是在尝试调试。通常情况下,我的 PHP 代码如下:

$offer=$campid;
$id=$user_id.'0'.$offer;
$sql="INSERT INTO offer_status (id,user_id,sql_id,disabled) VALUES (?,?,?,?)
ON DUPLICATE KEY UPDATE disabled=VALUES(disabled)";

    $db->prepare($sql)->execute(array($id, $user_id, $offer, 0));

id是主键。这是什么意思?

附加内容:执行DESC offer_status的结果:

Field   Type    Null    Key Default Extra
id  int(12) NO  PRI NULL    
user_id int(12) NO      NULL    
sql_id  int(12) NO  MUL NULL    
favor   tinyint(4)  NO      0   
disabled    tinyint(4)  NO      0   
pref    int(2)  NO      0   

你能否在你的问题中附上这个查询的结果和 DESC offer_status - John Woo
你想要哪个查询的结果? - kmoney12
这个是 DESC offer_status - John Woo
完成了...希望你能看懂... - kmoney12
2个回答

13

8854011812超出了int范围。它将被替换为最大的int数,即2147483647

如果第二次插入一个大于int最大值的值,则会出现重复键错误。

如果您需要这么高的数字,可以将数据类型更改为bigint


我在数据结构中将“id”类型更改为int(35),但仍然发生相同的事情...我错过了什么步骤吗? - kmoney12
改为 bigint。无论在括号内写什么,int 的取值范围都没有那么大。 - juergen d
查询优化来说,使用哪个更好,是varchar还是其他类型? - kmoney12
1
如果是数字,始终选择数值数据类型而不是字符串。 - juergen d

1

哦,我明白了。既然您提到ID是主键,我猜测其数据类型为int,而SIGNED INT的最大值为2147483647。您应该将数据类型更改为decimal(15,0)VARCHAR(15),以便容纳该值。

您正在插入的值8854011812有点超出int所能承受的范围。


您不能使用该值。最好使用 DECIMAL(12,0) 或 numeric。 - John Woo
在使用自然数时,不需要像“decimal”一样的定点数据类型。 - juergen d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接