2012-02-19 8 views
5

Tengo problemas con la clave única compuesta por MySQL.MySQL trunca el índice único compuesto a 64 caracteres

Consiste en URL, valor entero y campo de fecha.

Pero cuando trato de insertar una fila, me sale una excepción:

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' 

Como se puede ver, el índice compuesto fue truncado por 64 caracteres, y debido a esto no es una única más (I 'm recuperar datos de una fuente externa una vez al día)

Pero el más confuso que el registro se inserta, sin embargo una excepción sobre la violación de restricción fue arrojado

Hubo una pregunta similar here, pero el único consejo fue utilizar SHOW CREATE TABLE para conocer la longitud real del índice.

Mostrar crear tablas muestra esto:

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

Por lo tanto, no veo ninguna limitación a la longitud del índice.

Muchas gracias a todos, que pueden ayudarnos con este tema.

+0

¿Alguna vez encontró una solución a su problema? Tenemos un problema similar con un índice único en un campo VARCHAR (255). Aparentemente JDBC/JPA arroja una MySQLIntegrityConstraintViolationException que incluye los primeros 64 caracteres del valor de cadena que estamos tratando de insertar. Sin embargo, insertar el mismo valor directamente a través de MySQL Workbench funciona bien sin problemas. Esto me lleva a pensar que podría estar relacionado con JPA o el controlador JDBC. – tvirtualw

+0

Encontramos una solución a nuestro problema. Por defecto, la intercalación de MySQL no distingue entre mayúsculas y minúsculas. Los valores que tratamos de insertar en nuestra tabla tenían los mismos caracteres y, a veces, diferían en que una letra fuera mayúscula y la otra en minúscula. Me gusta 'abcd' vs. 'aBcd'. Con la intercalación por defecto causará una violación única del índice (supongo que lo mismo para las claves primarias). Lo cambiamos a utf8_bin y luego funcionó para nosotros. – tvirtualw

Respuesta

1

No tengo una respuesta a su pregunta exacta sin embargo, una sugerencia que debería solucionarlo mientras mejora los tiempos de la base de datos.

Crear una tabla es decir, URI (URI_id unsigned int PK AI, URI VARCHAR (128) NOT NULL, UNIQUE KEY (URI)) y cambiar auto_ru_sale para almacenar uri_id en lugar de URI

Esto significará esa clave se convierte en una clave de INT, INT, DATE que será más eficiente. El tamaño de su mesa se reducirá debido a menos duplicados. En general, la normalización es beneficiosa.

También aconsejaría lo mismo aplicado al campo "región", ya que supongo que también tiene una gran cantidad de datos duplicados.

Cuestiones relacionadas