在多列上使用唯一约束的功能



我有此表:

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

您可以在表达式上创建索引。我不确定您可以对表达式施加独特的约束。但这可以做您想要的:

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单独唯一。如果有,则没有理由对这对唯一的约束。

UNIQUE的约束只能对一个或多个列进行,而不是表达式(包括函数),就像您可以在UNIQUE索引中使用一样。尽管使用索引实现约束,但仍有一些差异。请参阅:

  • PostgreSQL如何执行唯一的约束/使用哪种类型的索引?

btw:

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

这不是多列UNIQUE索引所取得的成就。仅组合是唯一的,因此(1,3)将是(3,1)的欺骗,但是(2,1)仍然允许,因此1仍然可以在blue列中的另一个记录中。您的描述与约束不符。至少两者都关闭。

还要注意NULL逃避了您的规则。因此,您也可能需要NOT NULL的约束。请参阅:

  • 用空列创建独特的约束

最新更新