我有此表:
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列时,诸如LEAST
和GREATEST
之类的函数是否唯一?最少和最出色的功能的目的是,当一个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) );
注意:您可能不希望red
和blue
单独唯一。如果有,则没有理由对这对唯一的约束。
UNIQUE
的约束只能对一个或多个列进行,而不是表达式(包括函数),就像您可以在UNIQUE
索引中使用一样。尽管使用索引实现约束,但仍有一些差异。请参阅:
- PostgreSQL如何执行唯一的约束/使用哪种类型的索引?
btw:
最少和最大功能的目的是,当一个ID以红色为红色时,它也不能在蓝色列中的另一个记录中。
这不是多列UNIQUE
索引所取得的成就。仅组合是唯一的,因此(1,3)
将是(3,1)
的欺骗,但是(2,1)
仍然允许,因此1
仍然可以在blue
列中的另一个记录中。您的描述与约束不符。至少两者都关闭。
还要注意NULL
逃避了您的规则。因此,您也可能需要NOT NULL
的约束。请参阅:
- 用空列创建独特的约束