2012-02-19 397 views
5

我在使用MySQL編寫的唯一密鑰時遇到問題。MySQL截斷了由64個字符組成的唯一索引

它由URL,整數值和日期字段組成。

但是,當我嘗試插入行,我得到一個異常:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'http://cars.auto.ru/cars/used/sale/16152870-c13f1.html-2012-02-1' for key 'one_a_day_idx' 

正如你所看到的,綜合指數更是由64個字符被截斷,並因爲這一點的話(我不是唯一「M檢索來自外部源,每天一次)

但最令人困惑的是,記錄插入數據,儘管關於約束衝突引發了異常

也有類似的問題here,但唯一的建議是使用SHOW CREATE TABLE來找出索引的實際長度。

展創建表顯示了這一點:

| auto_ru_sale | CREATE TABLE `auto_ru_sale` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `template` int(11) NOT NULL, 
    `region` varchar(128) NOT NULL, 
    `URI` varchar(128) NOT NULL, 
    `subType` varchar(128) NOT NULL, 
    `cost` int(11) NOT NULL, 
    `productionYear` int(11) NOT NULL, 
    `engineVolume` int(11) NOT NULL, 
    `transmitionType` varchar(1) NOT NULL, 
    `run` int(11) NOT NULL, 
    `evaluationDate` date NOT NULL, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `one_a_day_idx` (`template`,`URI`,`evaluationDate`), 
    KEY `prodyear_idx` (`productionYear`), 
    KEY `evdate_idx` (`evaluationDate`), 
    CONSTRAINT `auto_ru_sale_ibfk_1` FOREIGN KEY (`template`) REFERENCES `auto_ru_ 
datatemplate` (`ID`) ON DELETE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=127012 DEFAULT CHARSET=utf8 | 

所以,我看不出有任何限制指數的長度。

非常感謝大家,他們可以爲這個問題提供一些幫助。

+0

你有沒有想過解決你的問題?我們在VARCHAR(255)字段的唯一索引中遇到類似的問題。顯然,JDBC/JPA引發MySQLIntegrityConstraintViolationException,包括我們嘗試插入的字符串值的前64個字符。但是,通過MySQL Workbench直接插入相同的值可以毫無問題地正常工作。這使我相信它可能與JPA或JDBC驅動程序有關。 – tvirtualw 2014-03-26 23:40:34

+0

我們找到了解決我們問題的方法。默認情況下,MySQL整理不區分大小寫。我們試圖在我們的表格中插入的值具有相同的字符,有時它們僅由一個字母爲大寫字母,另一個字母爲小寫字母而不同。像'abcd'和'aBcd'一樣。使用默認排序規則會導致唯一的索引違規(我猜主鍵相同)。我們將其更改爲utf8_bin,然後它爲我們工作。 – tvirtualw 2014-03-28 12:48:12

回答

1

我沒有回答你的確切問題,但一個建議,應該解決它,同時提高數據庫時間。

創建一個表即的URI(URI_id INT UNSIGNED PK AI,URI VARCHAR(128)NOT NULL,UNIQUE KEY(URI)),並更改auto_ru_sale存儲而不是URI

uri_id這將意味着鍵變成INT,INT,DATE的關鍵將更加高效。由於重複次數較少,您的桌子尺寸會減少。一切正常化是有益的。

我也建議同樣適用於「區域」字段,因爲我假設也有大量重複數據。