我在postgres中有以下表格:
create table1 (col1 character varying, col2 character varying);
我的表格包含以下数据:
col1 col2
Questions Tags Users
Value1 Value2 Val
我想找到col1和col2的长度,当第1列和第2列的值的长度超过6时,我想截断它并丢弃剩余的值。即我希望我的决赛桌看起来如下:
col1 col2
Questi Tags U
Value1 Value2
实际上我想要这样做的原因是,当我在table1上创建索引时,我收到以下错误:
错误:索引行大小2744超过索引“allstrings_string_key”的最大值2712 提示:无法索引大于缓冲区页面1/3的值。 考虑值的MD5哈希的函数索引,或使用全文索引。
我知道我可以通过将值导入某些编程语言然后截断该值来实现此目的。有没有办法在postgres中使用sql查询实现相同的目的。
答案 0 :(得分:1)
难道你不能只更新它们以仅包含长度为6的字符串吗?
我不是职业选手,所以这可能不是最好的方法,但无论如何应该做好工作:
UPDATE table1 SET col1 = SUBSTRING(col1, 1, 6) WHERE LEN(col1) > 6
UPDATE table1 SET col2 = SUBSTRING(col2, 1, 6) WHERE LEN(col2) > 6
答案 1 :(得分:1)
我建议您实际遵循Postgres的建议,而不是更改您的数据。显然,不应将具有2k字符长字符串的列编入索引 - 或者不使用btree索引。
如果索引背后的想法是搜索,请改为使用全文搜索:
http://www.postgresql.org/docs/current/static/textsearch.html
如果需要背后的想法是排序,请使用功能索引。例如:
create index tbl_sort on (substring(col from 1 for 20));
然后,不是按col
排序,而是按substring(col from 1 for 20)
排序。
答案 2 :(得分:0)
您是否尝试将列的类型更改为CHAR
而不是VARCHAR
?
ALTER TABLE table1
ALTER COLUMN col1 SET DATA TYPE CHAR(6),
ALTER COLUMN col2 SET DATA TYPE CHAR(6)
如果您需要将列设置为可变长度,则可以指定限制(请注意,这是PostgreSQL扩展名):
ALTER TABLE table1
ALTER COLUMN col1 SET DATA TYPE CHARACTER VARYING(6),
ALTER COLUMN col2 SET DATA TYPE CHARACTER VARYING(6)