2012-12-30 46 views
4

當沒有值甚至是相同的,我得到一個非常奇怪的重複錄入錯誤......重複按鍵輸入時沒有值是重複

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

返回:

#1062 - 重複錄入「2147483647 'for key'PRIMARY'

這對我來說毫無意義!

注意:此代碼通常不會執行,我只是試圖調試。通常在我的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 
+0

你可以發佈這個查詢的結果以及你的問題'DESC offer_status'嗎? –

+0

你想得到哪個查詢結果? – hellohellosharp

+0

這一個'DESC offer_status' –

回答

13

8854011812超出int範圍。它將被替換爲2147483647的最大int號碼。

第二次插入的值大於int max時,將會出現重複鍵錯誤。

如果您需要如此高的數字,您可以將您的數據類型更改爲bigint

+0

Quadruple facepalm ....我的壞!謝謝! – hellohellosharp

+0

我在數據結構中將'id'類型更改爲int(35),但同樣的事情仍在發生......我錯過了一個步驟? – hellohellosharp

+0

Chnage to'bigint'。 'int'沒有這麼大的範圍,不管你在'()'中寫什麼。 –

1

哦,我明白了。既然你提到ID是主要的,我猜它的數據類型是int,其中SIGNED INT的最大值是2147483647。您應該將數據類型更改爲decimal(15,0)VARCHAR(15),以便收集該值。

您插入的值8854011812有點超出int可容納的範圍。

+0

你不能有這個價值。更好地使用'DECIMAL(12,0)'或數字。 –

+0

使用自然數時,不需要像「decimal」這樣的定點數據類型。 –