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

时间:2017-12-19 15:13:36

标签: sql postgresql unique-constraint postgresql-10

我有这张桌子:

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为红色时,它也可以在蓝色列中的另一个记录中。

2 个答案:

答案 0 :(得分: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单独使用。如果存在,则没有理由对该对进行唯一约束。

答案 1 :(得分:0)

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

顺便说一句:

  

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

这不是多列UNIQUE指数所达到的目标。只有组合是唯一的,因此(1,3)将是(3,1)的欺骗,但仍然允许(2,1),因此1仍然可以在其他记录中blue。您的描述与约束不符。两个中至少有一个是关闭的。

另请注意,NULL会违反您的规则。所以你也可能需要NOT NULL个约束。参见: