我有时会在我的应用程序日志中收到以下插入 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/