mysql - 索引被截断的 "Exception: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry"错误

标签 mysql indexing unique-constraint unique-index

我有时会在我的应用程序日志中收到以下插入 MySQL 的错误:

2013/06/02 15:11:05 (Database) Exception: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '4d9acbacc6ed7dc2733025e4b8af7be4940fe5b70338789b34caea27695860fa' for key 'hash_UNIQUE'

上面的问题是被索引的值被截断为 64 个字符长,但实际列大小为 255 个字符长。该值的示例是:4d9acbacc6ed7dc2733025e4b8af7be4940fe5b70338789b34caea27695860fa2b497f6cd34851657c9d3e8e8e88713d80da1a22d8654cf98622e9af3f29481d .

表定义如下:

delimiter $$

CREATE TABLE `reset` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `identity_id` bigint(20) unsigned NOT NULL,
  `hash` varchar(255) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `upn` varchar(255) NOT NULL,
  `returnurl` varchar(255) DEFAULT NULL,
  `processed` char(1) DEFAULT 'N',
  `referer` varchar(15) DEFAULT 'CPCUsociety.org',
  PRIMARY KEY (`id`),
  UNIQUE KEY `hash_UNIQUE` (`hash`),
  KEY `reset_upn_ndx` (`upn`),
  KEY `reset_hash_ndx` (`hash`),
  KEY `reset_timestampndx` (`timestamp`),
  KEY `idendity_id_for_key_idx` (`identity_id`),
  CONSTRAINT `idendity_id_for_key` FOREIGN KEY (`identity_id`) REFERENCES `identity` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=585 DEFAULT CHARSET=utf8$$

如何强制MySQL使用全值作为索引?

最佳答案

我已经在我的本地环境中尝试了您的代码并且运行良好。我试过先插入这个查询:

INSERT INTO `test`.`reset`
    (`id`,`identity_id`,`hash`,`timestamp`,`upn`,`returnurl`,`processed`,`referer`)
VALUES
    (
    null, 1, '4d9acbacc6ed7dc2733025e4b8af7be4940fe5b70338789b34caea27695860fa2b497f6cd34851657c9d3e8e8e88713d80da1a22d8654cf98622e9af3f29481t',
    null, 'a', null, null, null
    );

效果很好。然后我尝试插入相同的查询并得到与您相同的错误:

Error Code: 1062. Duplicate entry '4d9acbacc6ed7dc2733025e4b8af7be4940fe5b70338789b34caea27695860fa' for key 'hash_UNIQUE'

好的,这里我只更改了散列的最后一个字符(b 代替 t),然后它工作正常:

INSERT INTO `test`.`reset`
    (`id`,`identity_id`,`hash`,`timestamp`,`upn`,`returnurl`,`processed`,`referer`)
VALUES
    (
    null, 1, '4d9acbacc6ed7dc2733025e4b8af7be4940fe5b70338789b34caea27695860fa2b497f6cd34851657c9d3e8e8e88713d80da1a22d8654cf98622e9af3f29481b',
    null, 'a', null, null, null
    );

这意味着 MySQL 正在使用 UNIQUE 索引的完整值,即使它只向您显示错误报告中的哈希值的一部分。

我找不到 mysql 不显示整个字符串的原因,但我相信您的问题绝对与解析器使用的部分索引无关。让我知道你过得怎么样。

关于mysql - 索引被截断的 "Exception: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16888260/

相关文章:

mysql - 如何处理有并发风险的任务?

mysql - 如何导出 MS Sql Server 数据库转储并将其导入 Mysql 数据库?

mysql - 提高 mySQL 查询的速度

sql - 使用约束检查sql唯一值

mysql - 在 MySQL 和 H2 中删除唯一约束

MySQL 使用 LEFT JOIN 从多个表中选择

php - 使用mysql和php打印两个日期之间的差异并打印每天的秒数

seo - 有没有比站点地图更有效的方法来添加/强制重新抓取/删除您网站在谷歌中的索引条目?

python - 以不同方式切片 numpy 数组的不同行

ruby-on-rails - 如何在 rails 事件记录中创建除 id 以外的唯一列