2009-02-05 80 views
0

議決什麼可能會導致自動增量主鍵字段(mysql)上的重複ID?

從開發人員:問題是,代碼的先前版本仍然寫信給其使用手冊ID而不是自動增量表。注意自己:總是檢查表格寫入的其他可能位置。

我們正在獲取表中的重複鍵。它們不是同時插入(相隔6個小時)。

表結構:

CREATE TABLE `table_1` (
    `sales_id` int(10) unsigned NOT NULL auto_increment, 
    `sales_revisions_id` int(10) unsigned NOT NULL default '0', 
    `sales_name` varchar(50) default NULL, 
    `recycle_id` int(10) unsigned default NULL, 
    PRIMARY KEY (`sales_id`), 
    KEY `sales_revisions_id` (`sales_revisions_id`), 
    KEY `sales_id` (`sales_id`), 
    KEY `recycle_id` (`recycle_id`) 
) ENGINE= MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=26759 ; 

插入:

insert into `table_1` (`sales_name`) VALUES ("Blah Blah") 

我們正在運行MySQL 5.0.20與PHP5,並使用mysql_insert_id()來插入查詢後立即取回插入ID。

+0

請提供SHOW CREATE TABLE的輸出,這將有所幫助。 – 2009-02-05 01:51:19

回答

5

過去即使定義了主鍵和auto_increment,我也有一些重複的鍵錯誤突然出現在MySql數據庫中。每次都是因爲表已損壞。

如果是腐敗執行檢查表應該暴露問題。您可以通過運行做到這一點:

CHECK TABLE tbl_name 

如果在回來的腐敗反正(通常說的大小大於它實際上應該是),然後只需運行下面來修復它:

REPAIR TABLE tbl_name 
2

sales_id字段是否有主鍵(或唯一鍵)?如果沒有,那麼其他的東西可能會插入或更新,重新使用現有的數字。而通過「別的東西」,我不只是指代碼;它可能是一個無意中訪問數據庫的人。

+0

對不起,是的,sales_id確實有一個主鍵。忘了提到這一點。好的,雖然+1 – 2009-02-05 00:44:45

0
  • 如果你在其他領域有一個唯一的關鍵,這可能是問題。

  • 如果您已達到auto_increment列的最高值,MySQL將繼續嘗試重新插入它。例如,如果sales_id是TINYINT列,你會怎麼達到127 ID

+0

nope和noope :( – 2009-02-05 02:04:24

+0

並非如此,如果發生這種情況,mysql會生成錯誤 – Zbynek 2016-11-04 15:25:53

2

至於對方說以後得到重複鍵錯誤;用你的例子是不可能的。

與您的問題無關,但您不必爲主鍵列創建單獨的鍵 - 只是在您已擁有唯一(主鍵)鍵時向表中添加額外的非唯一索引。

2

我們正在獲取表中的重複鍵。

你的意思是你在嘗試插入時出現錯誤,或者你的意思是你有一些值存儲在列中不止一次?

只有在您從INSERT中省略列時嘗試插入NULL或零時,纔會自動遞增。否則,您可以在INSERT語句中指定一個值,以覆蓋自動遞增機制。例如:

INSERT INTO table_1 (sales_id) VALUES (26759); 

如果您指定的值已經存在於表格中,則會出現錯誤。

1

請發佈此查詢結果:

SELECT `sales_id`, COUNT(*) AS `num` 
FROM `table_1` 
GROUP BY `sales_id` 
HAVING `num` > 1 
ORDER BY `num` DESC 
相關問題