MySQL将组合的唯一索引截断为64个字符

问题描述 投票:6回答:2

我遇到了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个字符,因此它不再是唯一的(我每天从外部源检索一次数据)

但最简单的是插入了记录,但抛出了关于约束违规的例外情况

有一个类似的问题here,但唯一的建议是使用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 |

所以,我没有看到索引长度的任何限制。

非常感谢大家,他们可以就这个问题提供一些帮助。

java mysql unique-key duplicates
2个回答
1
投票

我没有回答你的确切问题,但有一个建议应该在改善数据库时间的同时修复它。

创建一个表,即URI(URI_id INT UNSIGNED PK AI,URI VARCHAR(128)NOT NULL,UNIQUE KEY(URI))并更改auto_ru_sale以存储uri_id而不是URI

这意味着密钥成为INT,INT,DATE的密钥,这将更有效。由于重复次数较少,您的表格大小会减少。总而言之,正常化是有益的。

我也建议应用于“区域”字段,因为我认为它也有很多重复数据。


0
投票

我今天遇到了同样的问题。

我的问题是,唯一索引实际上超过64个字符,但错误消息只显示前64个字符。我认为这是同样的情况。

所以我遇到的是一个实际的重复键,这是由一些错误的日期格式引起的。

© www.soinside.com 2019 - 2024. All rights reserved.