假设MySQL(MyISAM)表中有两列:
title VARCHAR(1500)
url VARCHAR(155)
我想在两列上创建复合唯一索引。我知道限制长度功能用于太长的列(例如我的title
列)。它如何与复合索引一起使用?
我想要的是:
|--- url_value ---| + |--- title_value ---|
|--------155------| + |--------rest-------| <-- This should be the key length
我的意思是密钥应该具有最大长度(我使用utf8作为编码,因此对于唯一索引,每列允许限制为333个字符),其中列url
的所有155个字符和178个字符应在唯一索引中遵守列title
。对不起英语不好。我尽力解释。如果看起来令人困惑,请耐心等待,如果有必要,我很乐意提供更多信息。
答案 0 :(得分:2)
我不确定你的问题是什么,所以这可能没有真正回答它,但是在长字段上强制执行唯一性的一个选择是使用MD5强制对长字段的散列强制执行唯一约束,或任何其他适合您需要的哈希算法。所以......
title VARCHAR(1500)
url VARCHAR(155)
title_md5 VARCHAR(16)
您可以创建一个触发器,每次title_md5
更新时自动填充title
。然后,将您的唯一索引放在(url,title_md5)
。
当然这有一些缺点。实际表中存在更多开销 - 尽管其中大部分可以通过更小/更高效的索引来抵消。此外,索引title_md5
不会更快地搜索实际的title
列,因此如果您需要对其进行搜索,则可能需要title
上的“重复”索引。 / p>