2012-02-19 40 views
5

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.

+0

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

+0

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

Trả lời

1

Tôi chưa có câu trả lời cho câu hỏi chính xác của bạn, tuy nhiên, đề xuất nên sửa nó trong khi cải thiện thời gian cơ sở dữ liệu.

Tạo một bảng ví dụ URI (URI_id INT UNSIGNED PK AI, URI VARCHAR (128) NOT NULL, KEY UNIQUE (URI)) và thay đổi auto_ru_sale để lưu trữ uri_id thay vì URI

này sẽ có nghĩa là quan trọng mà sẽ trở thành một khóa của INT, INT, DATE sẽ hiệu quả hơn. Kích thước bảng của bạn sẽ giảm do ít trùng lặp hơn. Tất cả trong tất cả bình thường hóa đều có lợi.

Tôi cũng sẽ khuyên bạn áp dụng tương tự cho trường "khu vực" như tôi cho rằng cũng có nhiều dữ liệu trùng lặp.

Các vấn đề liên quan