我有一张桌子
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)));
有什么方法可以限制主索引中的列大小吗?
您不能在主键定义中使用表达式。这意味着您需要为该数据添加一个附加列,这可以通过使用生成的列来完成。此列可以在您的主键中使用:
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);