我有这张桌子:
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为红色时,它也可以在蓝色列中的另一个记录中。
答案 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) );
注意:您可能不希望red
和blue
单独使用。如果存在,则没有理由对该对进行唯一约束。
答案 1 :(得分:0)
UNIQUE
约束只能用于一个或多个列,而不能像UNIQUE
索引中那样使用表达式(包括函数)。虽然使用索引实现约束,但仍存在一些差异。参见:
顺便说一句:
最小和最大功能的目的是当一个ID为红色时,它也不能位于蓝色列中的另一个记录中。
这不是多列UNIQUE
指数所达到的目标。只有组合是唯一的,因此(1,3)
将是(3,1)
的欺骗,但仍然允许(2,1)
,因此1
仍然可以在其他记录中blue
列。您的描述与约束不符。两个中至少有一个是关闭的。
另请注意,NULL
会违反您的规则。所以你也可能需要NOT NULL
个约束。参见: