1

我有这张桌子:

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

4

2 回答 2

1

您可以在表达式上创建索引。我不太确定您是否可以对表达式施加唯一约束。但这可以满足您的要求:

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是独一无二的。如果有,则没有理由对该对进行唯一约束。

于 2017-12-19T15:15:38.550 回答
0

UNIQUE只能对一列或多列进行约束,而不是可以在UNIQUE索引中使用的表达式(包括函数)。虽然约束是使用索引实现的,但仍有一些差异。看:

顺便提一句:

最小和最大函数的目的是当一个 ID 为红色时,它不能同时在蓝色列中的另一条记录中。

这不是多列UNIQUE索引所能达到的。只有组合是唯一的,所以(1,3)会被欺骗(3,1),但(2,1)仍然是允许的,所以1仍然可以在blue中的另一条记录中。您的描述与约束不符。两者中至少有一个是关闭的。

另请注意,这会NULL规避您的规则。所以你可能也需要NOT NULL约束。看:

于 2017-12-19T15:25:26.653 回答