假设我有下表
TABLE subgroups (
group_id t_group_id NOT NULL REFERENCES groups(group_id),
subgroup_name t_subgroup_name NOT NULL,
more attributes ...
)
subgroup_name
对于group(group_id)
非常独特。group
可以包含多个subgroups
。subgroup_names
是用户提供的。 (我想避免使用subgroup_id
列。subgroup_name
在模型中有意义,不仅仅是一个标签,我提供了一个预定名称列表,但允许用户添加他的所有者柔韧性)。
我想有一个PRIMARY KEY(group_id,upper(trim(subgroup_name)));
据我所知,postgres不允许在函数上使用PRIMARY KEY / UNIQUE。 IIRC,关系模型还要求将列用作存储。
CREATE UNIQUE INDEX ON subgroups (group_id, upper(trim(subgroup_name)));
无法解决我的问题
因为我模型中的其他表将有FOREIGN KEYs指向这两列。
我看到两个选择。
选项A)
选项B)
任何见解?
注意:我正在使用Postgres 9.2
答案 0 :(得分:0)
实际上,您可以对函数的输出执行UNIQUE约束。但是,您无法在表定义中执行此操作。您需要做的是在之后创建一个唯一索引。如下所示:
CREATE UNIQUE INDEX subgroups_ukey2 ON subgroups(group_id, upper(trim(subgroup_name)));
PostgreSQL具有许多绝对惊人的索引功能,并且在功能输出上创建唯一(和部分唯一)索引的能力被严重低估。