2013-12-22 41 views
2

我有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

[與dba.SE相關的答案](http://dba.stackexchange.com/questions/25138/index-max-row-size-error/25140#25140)也可能有幫助。 –

回答

2

您的列可能包含多字節數據:varchar(2712)處理得很好,因此索引算法將計算c字符串長度是有意義的,因爲內存考慮因素是後者令人擔憂的關於。

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

這確實引起了:

從理論上說,你不能去錯了除以四所限制,即使用的列無界varchar和索引中的第一600個字左右,如不過,你是否真的需要索引這麼大的索引,因爲這樣做的價值主要在於排序。 Postgres(正確)建議您使用值的md5(如果您只對嚴格相等感興趣)或全文搜索(如果您對模糊匹配感興趣)。