错误1062(23000):键“PRIMARY”的值'2147483647'重复输入。

4

我有一张表格:

CREATE TABLE passenger_details
   (
    bank_card INT(20) NOT NULL AUTO_INCREMENT,
    email VARCHAR(20), 
    mobile INT(15) NOT NULL,
    p_id INT NOT NULL,    
    PRIMARY KEY (bank_card),
    FOREIGN KEY (p_id) REFERENCES passenger(p_id) 
    );

INSERT INTO passenger_details 
VALUES (0123012301230123,'blah_@hotmail.com',0872863492,1234);

select*from passenger_details;
+------------+--------------------+-----------+------+
| bank_card  | email              | mobile    | p_id |
+------------+--------------------+-----------+------+
| 2147483647 | blah_@hotmail.com  | 872863492 | 1234 |
+------------+--------------------+-----------+------+
1 row in set (0.00 sec)  

正如我们所看到的,之前的值在表格中出现了错误。应该是16个数字而不仅仅是10个数字,实际上是不同的数字。
当我尝试插入新值时:

INSERT INTO passenger_details 
VALUES (1234258431681842,'blah@icloud.com',0895764829,123548);

我收到了这个错误信息:

ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY'

如果bank_card是自增的,为什么会出现错误呢?我应该将PK更改到另一个位置吗?

1
'2147483647'是有符号 INT 的最大值,如果需要更大的值,则应将列转换为 UNSIGNED INT 或者使用 BIGINT 列。请参阅手册获取限制信息。此外,您需要考虑您的列是否应该是自增 int 类型。在 0123012301230123 中前缀的 0 可能会让我认为使用字符列更加适合它所做的事情。 - Wrikken
请注意,自动递增仅在您不为列提供任何值时才有效。 - nos
@Wrikken 太好了,我会去看一下!谢谢。 - Hugo
@nos 谢谢你提醒我 - Hugo
@Wrikken UNSIGNED仅用于INT,对吗?在这种情况下,我正在使用VARCHAR,实际上第一次我使用的是INT,但出现了错误。然后我改成了VARCHAR。当然,我需要显示0,因为有几张卡片以0开头。 - Hugo
@Hugo:是的,UNSIGNED 只适用于 INT 类型。而且,在这种情况下,CHAR 或 VARCHAR 更加合适。 - Wrikken
3个回答

12

INT最大有符号值为2147483647。任何大于该值的数字都将被截断为该值。您需要做的是将该列更改为varchar(20),它将保存最多20个字符的字符串,因为银行卡号是字符串而不是实际数字(您不会进行数学计算)。您还应该删除AUTO_INCREMENT,因为这不是您将要递增的值。


谢谢,非常好用。花了时间来弄明白,救了我的一天! - Jose Mhlanga

0

通过MySQL phpmyadmin面板,这就是我如何解决这个问题的方法

>Go to your Table's structure from  phpmyadmin panel
>> select that PRIMARY column , click on change
>>> Change Column type to "BIGINT" and Attributes to "unsigned"

使用其他SQL语句>将列属性更改为" BIGINT unsigned" 这对我有用


0

有些问题需要你自问。这个数字是怎么变得那么大的?我没有插入20亿行数据啊!

嗯,可能是你“烧掉”了那么多AUTO_INCREMENT ID。这种情况可能会以多种方式发生:

INSERT IGNORE ... -- when the insert is ignored (because it the row already exists)
REPLACE
IODKU

还有可能其他的。


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