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 |
所以,我看不出有任何限制指數的長度。
非常感謝大家,他們可以爲這個問題提供一些幫助。
你有沒有想過解決你的問題?我們在VARCHAR(255)字段的唯一索引中遇到類似的問題。顯然,JDBC/JPA引發MySQLIntegrityConstraintViolationException,包括我們嘗試插入的字符串值的前64個字符。但是,通過MySQL Workbench直接插入相同的值可以毫無問題地正常工作。這使我相信它可能與JPA或JDBC驅動程序有關。 – tvirtualw 2014-03-26 23:40:34
我們找到了解決我們問題的方法。默認情況下,MySQL整理不區分大小寫。我們試圖在我們的表格中插入的值具有相同的字符,有時它們僅由一個字母爲大寫字母,另一個字母爲小寫字母而不同。像'abcd'和'aBcd'一樣。使用默認排序規則會導致唯一的索引違規(我猜主鍵相同)。我們將其更改爲utf8_bin,然後它爲我們工作。 – tvirtualw 2014-03-28 12:48:12