这不能用单个CHECK
约束来完成,因为它本质上是一个依赖表的多个行的约束。
它与某种方式的UNIQUE
约束相似。在唯一约束中,没有两行可以具有相同的值。在这里,没有两行可以有重叠范围。所以,如果我们能够用检查重叠范围的条件替换平等条件(=
),那就恰到好处。
在另一个DBMS(Postgres)中,实际上可以使用专有的EXCLUDE
约束强制执行这个和类似的约束。
在Oracle现在有共同的FOREIGN KEY
,UNIQUE
和CHECK
限制其他DBMS,它实际上是可能的,但复杂的,如果你被允许加入另一列更改表设计:
CREATE TABLE reservation (
owner CHAR(10) NOT NULL PRIMARY KEY,
start INTEGER NOT NULL,
end INTEGER NOT NULL,
previous_end INTEGER NULL,
CONSTRAINT valid_range
CHECK (start <= end),
CONSTRAINT unique_end
UNIQUE (end),
CONSTRAINT previous_range_fk
FOREIGN KEY (previous_end)
REFERENCES reservation (end),
CONSTRAINT valid_previous
CHECK (previous_end < start)
) ;
我们很好去。你只需要正确地提供previous_end
的值,从本质上使该表成为一个链表。所有限制条件一起工作以确保范围不重叠。
,可以使用约束无法做到这一点。你需要一个trigger.stackoverflow.com/questions/8770552/can-i-have-a-constraint-on-count-of-distinct-values-in-a-column-in-sql –
是的,这就是我所知道的,但我想知道这是否可能。 –
你可以改变表格(添加更多列等)吗?如果是,那么是的,这是可能的。通过单独的DRI(FOREIGN KEY,UNIQUE和CHECK约束)使复杂但可能。 –