PostgreSQL PRIMARY KEY 限制索引长度 - VARCHAR 上的前缀

问题描述 投票:0回答:1

我有一张桌子

CREATE TABLE IF NOT EXISTS metadata (
    user_id   int not null,
    entry    VARCHAR(4096) not null
);

我正在尝试添加一个主键,将其在

entry
列上的大小限制为 16 个字节。 由于存储开销,我不想在输入字段上索引完整的
2730
(B-TREE 限制)字符。

ALTER TABLE metadata ADD PRIMARY KEY (user_id, (entry::varchar(16)));

不幸的是不允许这样的语法

SQL Error [42601]: ERROR: syntax error at or near "("

也不是:

ALTER TABLE metadata ADD PRIMARY KEY (user_id, entry(16)) -- That would probably work on MySQL

看来我可以创建一个普通的索引就好了

create index some_index on metadata(user_id, (entry::varchar(16)));

有什么方法可以限制主索引中的列大小吗?

postgresql
1个回答
0
投票

您不能在主键定义中使用表达式。这意味着您需要为该数据添加一个附加列,这可以通过使用生成的列来完成。此列可以在您的主键中使用:

ALTER TABLE metadata ADD COLUMN pkey_entry CHAR(16) GENERATED ALWAYS AS ( SUBSTRING(entry, 16)) STORED;
ALTER TABLE metadata ADD CONSTRAINT pkey_metadata PRIMARY KEY (user_id, pkey_entry);
© www.soinside.com 2019 - 2024. All rights reserved.