我在postgresql中有以下表格:
database=# \d dic
Table "public.dic"
Column | Type | Modifiers
-------------+-------------------------+-----------
id | bigint |
stringvalue | character varying(2712) |
database=# create index idStringvalue on dic(id,stringvalue);
ERROR: index row size 2728 exceeds maximum 2712 for index "idstringvalue"
HINT: Values larger than 1/3 of a buffer page cannot be indexed.
Consider a function index of an MD5 hash of the value, or use full text indexing.
我不知道为什么在stringvalue的大小是2712时错误来了。
我想截断dic中的所有stringvalue导致上述错误。但是,我没有得到如何做到这一点。有人可以帮帮我吗?
我甚至可以删除导致此错误的行。我有什么方法可以这样做吗?
答案 0 :(得分:2)
你的列可能包含多字节数据:虽然varchar(2712)处理的很好,但索引算法计算c字符串长度是有意义的,因为内存考虑因素是后者所担心的
理论上,你不能将限制除以4,即对列使用无界varchar,并将前600个字符编入索引,例如:
create index on dic((left(stringvalue, 600)));
这确实提出了一个问题,即你是否真的需要索引这么大的东西,因为这样做的主要在于排序。 Postgres(正确)建议您使用值的md5(如果您只对严格相等感兴趣)或全文搜索(如果您对模糊匹配感兴趣)。