在多列的唯一约束中使用函数

Use functions in unique constraint on multiple columns

我有这个table:

CREATE TABLE games (
    red int unique, 
    blue int unique, 
    unique (LEAST(red, blue), GREATEST(red, blue)),
    check (red <> blue)
);

当我尝试生成 table 时,它出错了 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 索引中使用的表达式(包括函数)。虽然约束是使用索引实现的,但仍存在一些差异。参见:

  • How does PostgreSQL enforce the UNIQUE constraint / what type of index does it use?

顺便说一句:

The purpose of the least and greatest functions is so that when one ID is in red, it can't also be in another record in the blue column.

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

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

  • Create unique constraint with null columns