これは単一のCHECK
という制約では実行できません。基本的には、テーブルの複数の行に依存する制約なのでです。
ある意味ではUNIQUE
という制約に似ています。一意の制約では、2つの行が同じ値を持つことはできません。この場合、2つの行が重複する範囲を持つことはできません。したがって、等価条件(=
)を範囲の重複をチェックする条件に置き換えることができれば、それは正しいでしょう。
別のDBMS(Postgres)では、独自のEXCLUDE
という制約を使用して、これと同様の制約を厳密に適用することは実際可能です。オラクルで
今と共通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 –
はいこれまでに知っていることはthatsですしかし、これが可能かどうか疑問に思います。 –
テーブルを変更できますか(列を追加するなど)?はいの場合は、可能です。複雑ではあるが、DRI単独(外部キー、ユニークおよびCHECK制約)によって可能。 –