我正在使用 Postgres 表来存储 HTML 数据。其中一列的类型为
varchar
,这是存储 HTML 数据的位置。我的理解是这个列数据类型没有最大长度。
我尝试在此列上创建唯一索引,以防止添加重复的 HTML 条目。
该表被另一个表引用。不允许重复的 HTML 条目。这是一种使用数据(或表)标准化的数据压缩形式。
如果表 A 引用表 B,并且表 B 存储去重后的 HTML 数据,则需要更少的存储空间来存储完整的数据集,因为这些条目不是在表 A 中存储重复的 HTML 条目,而是被规范化并存储在单独的空间中。表,表 B。
当我尝试创建唯一索引时,出现错误:
CREATE UNIQUE INDEX html_source_div_html_source_div_idx
ON rightmove.html_source_div (html_source_div)
SQL 错误 [54000]:错误:索引行大小 4536 超过索引“html_source_div_html_source_div_idx”的 btree 版本 4 最大值 2704
详细信息:索引行引用关系“html_source_div”中的元组 (0,46)
提示:无法对大于缓冲区页 1/3 的值建立索引。 考虑值的 MD5 哈希值的函数索引,或使用全文索引。
我想添加一个用于快速查找现有数据的索引和一个唯一约束以防止插入重复的条目。如果使用正确的索引类型,Postgres 可能可以使用单个索引来完成这两个功能。
我不想
md5hash
数据,因为有碰撞的风险。如果发生碰撞,整个过程就会中断。
PostreSQL 索引确实有最大大小,您可以尝试减轻与计算列的哈希冲突,也许可以尝试这样的操作:
ALTER TABLE html_source_div ADD COLUMN html_hash bytea;
UPDATE html_source_div SET html_hash = digest(html_source_div, 'sha256');
和
CREATE UNIQUE INDEX html_source_div_html_hash_idx ON html_source_div (html_hash);