2014-11-22 33 views
0

我有一個奇怪的錯誤,當我試圖幾個具體的數據添加到表中。以下是我的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; 


INSERT INTO `phonenumberverifier`.`phonenumbers` (`id`, `number`, `added`) VALUES (NULL, '3522316712', CURRENT_TIMESTAMP) 

「id」是主鍵,添加的字段是當前時間戳。

以下是我得到的錯誤。

#1062 - Duplicate entry '2147483647' for key 'number' 

請注意數字值2147483647作爲記錄存在。但這與這個新條目無關。該表與其他表沒有任何依賴關係。

請讓我知道是什麼原因造成這個問題,哪些需要做,以解決這個問題。提前致謝。

+1

如果'id'是您聲明的主鍵,爲什麼這不會反映在您的'CREATE'語句中? – 2014-11-22 17:25:13

+0

顯然,這裏沒有PK – Strawberry 2014-11-22 17:26:09

+0

另外,正如hellcode指出的,如果您的應用程序允許使用非負鍵,您的主鍵應該可以是無符號的。 – 2014-11-22 17:26:32

回答

2

您的錯誤特別奇怪,因爲您的代碼段沒有指定number是唯一的(並且您不顯示唯一的索引)。我會認爲這是一個疏忽,因爲這一點上的錯誤信息非常明確。

發生了什麼是您正在分配比允許進入該字段的值更大的值。

當MySQL在數字列是列數據類型的 允許範圍之外存儲值,結果在效果取決於 SQL模式在時間:

documentation解釋
  • 如果啓用嚴格SQL模式,則MySQL會根據SQL 標準拒絕帶有錯誤的超出範圍的值,並且插入失敗。

  • 如果沒有啓用限制模式,MySQL會將該值剪切到該範圍的相應端點,並將結果值存儲爲 。

當外的範圍內的值被分配給一個整數列,MySQL的 存儲表示列 數據類型範圍的相應的端點的值。如果將256存儲到TINYINT或TINYINT UNSIGNED 列中,則MySQL分別存儲127或255。

因此,您的號碼被分配了最大的可能值。如果您不止一次執行此操作,則會出現一個唯一的約束/索引,然後您將看到您看到的錯誤。

如果您沒有唯一的約束/索引,則每次插入的值過大時,值2147483647都會置於列中。

+0

謝謝!我將數據類型更改爲BIGINT。 – 2014-11-22 17:48:55

1

數量被定義爲整數值和2147483647是帶符號的整數可採取的最大值(最小值-2147483648)。我想在你的創建聲明是缺少數字被定義爲唯一鍵的事實。你應該看看你的實際表格定義。你在這裏提供的那個不是理由。那麼在插入後沒有錯誤信息的號碼就是2147483647。

+0

謝謝。我將數據類型更改爲BIGINT。 – 2014-11-22 17:49:25

-1

是的,無符號INT可以是隻從-2147483648到-2147483647(根據this link)。所以,它不可能是3522316712.

+0

不,不,int總是int。它的大小是4個字節。 – 2014-11-22 17:45:30

+0

_Unsigned_ INT的範圍是0到4294967295.您聲明的範圍是_signed_ INT。 – 2014-11-23 15:58:04