在多列上使用唯一约束中的函数

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

我有这张桌子:

CREATE TABLE games (
    red int unique, 
    blue int unique, 
    unique (LEAST(red, blue), GREATEST(red, blue)),
    check (red <> blue)
);

当我试图制作表格时,它会错误syntax error at or near "("。当使2列独特时,不允许使用像LEASTGREATEST这样的函数吗?最小和最大函数的目的是当一个ID为红色时,它也不能位于蓝色列中的另一个记录中。

sql postgresql unique-constraint postgresql-10
2个回答
0
投票

您可以在表达式上创建索引。我不太确定你能对表达式设置一个独特的约束。但这可以做你想要的:

CREATE TABLE games (
    red int not null, 
    blue int not null, 
    check (red <> blue)
);

create unique index unq_games_red_blue on ( least(red, blue), greatest(red, blue) );

注意:您可能不希望redblue单独使用。如果存在,则没有理由对该对进行唯一约束。


0
投票

UNIQUE约束只能用于一个或多个列,而不能像UNIQUE索引中那样使用表达式(包括函数)。虽然使用索引实现约束,但仍存在一些差异。看到:

BTW:

最小和最大函数的目的是当一个ID为红色时,它也不能位于蓝色列中的另一个记录中。

这不是多列UNIQUE指数所达到的目标。只有组合是独一无二的,所以(1,3)将是(3,1)的骗局,但仍然允许(2,1),所以1仍然可以在blue专栏中的另一个记录。您的描述与约束不符。两者中至少有一个是关闭的。

还要注意NULL规避你的规则。所以你可能也需要NOT NULL约束。看到:

© www.soinside.com 2019 - 2024. All rights reserved.