1

我在 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 查询来达到同样的效果。

4

3 回答 3

2

你不能只更新它们以包含最大长度为 6 的字符串吗?

我不是 postrgres pro,所以这可能不是最好的方法,但无论如何都应该完成这项工作:

UPDATE table1 SET col1 = SUBSTRING(col1, 1, 6) WHERE LEN(col1) > 6
UPDATE table1 SET col2 = SUBSTRING(col2, 1, 6) WHERE LEN(col2) > 6
于 2013-10-21T08:06:31.677 回答
1

我建议您实际上遵循 Postgres 的建议,而不是更改您的数据。显然,不应该对具有 2k 个字符长字符串的列进行索引——或者无论如何都不应该使用 btree 索引。

如果索引背后的想法是搜索,请改用全文搜索:

http://www.postgresql.org/docs/current/static/textsearch.html

如果需求背后的想法是排序,请改用功能索引。例如:

create index tbl_sort on (substring(col from 1 for 20));

然后,而不是colorder by , order by substring(col from 1 for 20)

于 2013-10-21T08:23:39.207 回答
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)
于 2013-10-21T07:48:47.597 回答