Tôi gặp sự cố với khóa được tạo bằng MySQL độc đáo.MySQL cắt ngắn chỉ mục duy nhất được tạo thành thành 64 ký tự
Nó bao gồm URL, giá trị số nguyên và trường ngày.
Nhưng khi tôi cố gắng để chèn hàng, tôi nhận được một ngoại lệ:
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'
Như bạn có thể thấy, chỉ số sáng tác đã được cắt bớt 64 ký tự, và vì điều này nó không phải là một độc đáo nữa (tôi đang lấy dữ liệu từ nguồn bên ngoài mỗi ngày một lần)
Nhưng khó hiểu nhất mà các bản ghi được chèn, mặc dù một ngoại lệ về vi phạm chế đã được ném
có một câu hỏi tương tự here, nhưng lời khuyên duy nhất là sử dụng SHOW CREATE TABLE để tìm hiểu chiều dài thực tế của chỉ mục.
Hiện tạo bảng cho thấy điều này:
| 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 |
Vì vậy, tôi không thấy bất kỳ hạn chế đối với chiều dài chỉ mục.
Rất cám ơn tất cả mọi người, những người có thể cung cấp một số trợ giúp về vấn đề này.
Bạn đã bao giờ tìm ra giải pháp cho vấn đề của mình chưa? Chúng tôi có vấn đề tương tự với chỉ mục duy nhất trên trường VARCHAR (255). Dường như JDBC/JPA ném một MySQLIntegrityConstraintViolationException bao gồm 64 ký tự đầu tiên của giá trị chuỗi mà chúng ta đang cố chèn vào. Tuy nhiên, chèn cùng một giá trị trực tiếp thông qua MySQL Workbench hoạt động tốt mà không có vấn đề. Điều này khiến tôi tin rằng nó có thể liên quan đến JPA hoặc trình điều khiển JDBC. – tvirtualw
Chúng tôi đã tìm ra giải pháp cho vấn đề của mình. Theo mặc định, collation MySQL không phân biệt chữ hoa chữ thường. Các giá trị mà chúng tôi đã cố chèn vào bảng của chúng tôi có cùng các ký tự và đôi khi chúng chỉ khác nhau một chữ cái là chữ hoa, chữ thường khác. Giống như 'abcd' so với 'aBcd'. Với collation mặc định nó sẽ gây ra một sự vi phạm chỉ mục duy nhất (tôi đoán tương tự cho các khóa chính). Chúng tôi thay đổi nó thành utf8_bin và sau đó nó làm việc cho chúng tôi. – tvirtualw