我有这张桌子:
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
索引中那样使用表达式(包括函数)。虽然使用索引实现约束,但仍存在一些差异。看到:
BTW:
最小和最大函数的目的是当一个ID为红色时,它也不能位于蓝色列中的另一个记录中。
这不是多列UNIQUE
指数所达到的目标。只有组合是独一无二的,所以(1,3)
将是(3,1)
的骗局,但仍然允许(2,1)
,所以1
仍然可以在blue
专栏中的另一个记录。您的描述与约束不符。两者中至少有一个是关闭的。
还要注意NULL
规避你的规则。所以你可能也需要NOT NULL
约束。看到: