【发布时间】:2011-04-26 11:30:48
【问题描述】:
我有一个 MySQL 表,将 url 存储为唯一键。我开始在我的键上发生冲突,因为键本身似乎只是任何 url 的前 64 个字节(或者如果您愿意,它是一个 latin-1 排序的字符)。因此,如果一个 url 超过 64 个字符并且我已经有一个类似的 url,它会抛出一个错误。
例如:
SELECT l.link_id FROM mydb.links l WHERE
url = 'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elected_Me_as_Their_Leader/index.html'
抛出此错误:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elec' for key 'url'
MyISAM 不应该有 1000 字节的密钥长度吗?
编辑:CREATE TABLE STATUS 调用中似乎没有列出前缀长度,如下所示:
CREATE TABLE `links` (
`link_id` int(11) NOT NULL AUTO_INCREMENT,
`url` varchar(500) NOT NULL,
PRIMARY KEY (`link_id`),
UNIQUE KEY `url` (`url`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
我尝试将一个设置为 256,如下所示:
ALTER TABLE `mydb`.`links`
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC) ;
我收到以下错误:
ERROR 1062: Duplicate entry '<...64-byte key...>' for key 'url'
SQL Statement:
ALTER TABLE `mydb`.`links`
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC)
ERROR: Error when running failback script. Details follow.
ERROR 1050: Table 'links' already exists
我认为回退只是因为我通过 MySQL Workbench 运行了 ALTER TABLE。
【问题讨论】:
-
在你的链接表上做一个
show create table。索引可能定义为长度为 64。
标签: mysql myisam unique-key mysql-error-1062 unique-index