MySQL усекает составной уникальный индекс до 64 символов

У меня проблемы с уникальным ключом, составленным MySQL.

Он состоит из URL-адреса, целочисленного значения и поля даты.

Но когда я пытаюсь вставить строку, я получаю исключение:

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'

Как видите, составной индекс был усечен на 64 символа, и из-за этого он больше не является уникальным (я получаю данные из внешний источник один раз в день)

Но больше всего сбивает с толку то, что запись была вставлена, хотя было выдано исключение о нарушении ограничения

Там был аналогичный вопрос здесь , но единственным советом было использовать SHOW CREATE TABLE, чтобы узнать фактическую длину индекса.

Показать таблицы создания показывает следующее:

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

Итак, я не вижу никаких ограничений на длину индекса.

Большое спасибо всем, кто может помочь в этом вопросе.

6
задан Community 23 May 2017 в 11:58
поделиться