如何截断列以创建索引?

时间:2013-12-22 02:32:39

标签: sql postgresql postgresql-9.1

我在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导致上述错误。但是,我没有得到如何做到这一点。有人可以帮帮我吗?

我甚至可以删除导致此错误的行。我有什么方法可以这样做吗?

1 个答案:

答案 0 :(得分:2)

你的列可能包含多字节数据:虽然varchar(2712)处理的很好,但索引算法计算c字符串长度是有意义的,因为内存考虑因素是后者所担心的

理论上,你不能将限制除以4,即对列使用无界varchar,并将前600个字符编入索引,例如:

create index on dic((left(stringvalue, 600)));

这确实提出了一个问题,即你是否真的需要索引这么大的东西,因为这样做的主要在于排序。 Postgres(正确)建议您使用值的md5(如果您只对严格相等感兴趣)或全文搜索(如果您对模糊匹配感兴趣)。