2012-02-19 13 views
5

Sto riscontrando problemi con MySQL composto da chiave univoca.MySQL tronca l'indice univoco composto da 64 caratteri

Consiste di URL, valore intero e campo della data.

Ma quando provo ad inserire la riga, ottengo un'eccezione:

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' 

Come si può vedere, indice composto è stato troncato da 64 caratteri, e per questo non è un unico più (I 'm il recupero dei dati da una fonte esterna una volta al giorno)

Ma il più confusione che il record è stato inserito, anche se un'eccezione sulla violazione del vincolo è stato gettato

C'era una domanda simile here, ma l'unico consiglio era di usare SHOW CREATE TABLE per scoprire la lunghezza effettiva dell'indice.

Mostra creare tabelle mostra questo:

| 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 | 

Quindi, non vedo alcuna limitazione per la lunghezza degli indici.

Mille grazie a tutti, chi può dare un aiuto in merito a questo problema.

+0

Hai mai trovato una soluzione al tuo problema? Abbiamo un problema simile con un indice univoco su un campo VARCHAR (255). Apparentemente JDBC/JPA lancia una MySQLIntegrityConstraintViolationException che include i primi 64 caratteri del valore di stringa che stiamo tentando di inserire. Tuttavia, l'inserimento dello stesso valore direttamente tramite MySQL Workbench funziona correttamente senza problemi. Questo mi porta a credere che potrebbe essere correlato a JPA o al driver JDBC. – tvirtualw

+0

Abbiamo trovato una soluzione al nostro problema. Per impostazione predefinita, la raccolta MySQL non fa distinzione tra maiuscole e minuscole. I valori che abbiamo provato ad inserire nella nostra tabella avevano gli stessi caratteri ea volte differivano da una lettera in maiuscolo, l'altra in minuscolo. Come "abcd" e "aBcd". Con le regole di confronto predefinite causerà una violazione dell'indice univoca (credo sia la stessa per le chiavi primarie). L'abbiamo cambiato in utf8_bin e poi ha funzionato per noi. – tvirtualw

risposta

1

Non ho una risposta alla tua domanda esatta, tuttavia un suggerimento che dovrebbe risolverlo migliorando i tempi del database.

Creare una tabella cioè URI (URI_id unsigned int PK AI, URI VARCHAR (128) NOT NULL, UNIQUE KEY (URI)) e cambiare auto_ru_sale per memorizzare uri_id invece di URI

Questo significherà che chiave diventa un chiave di INT, INT, DATE che sarà più efficiente. Le dimensioni del tuo tavolo si ridurranno a causa di meno duplicati. Tutto sommato la normalizzazione è vantaggiosa.

Vorrei anche consigliare lo stesso applicato al campo "regione" come suppongo che abbia anche molti dati duplicati.