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