多列检查约束

时间:2017-01-26 18:44:12

标签: oracle oracle11g

我有一个“电影”表,我需要添加一个限制因素,“史蒂文斯皮尔伯格”电影必须在1990年之前和“詹姆斯卡梅隆”电影必须在1990年之后。

我是Oracle SQL新手。我尝试了一些查询,但它们没有用。像

这样的东西
alter table movie_16bce1346 add constraint chk_spk 
                if director='Steven Spielberg' then check (year>1990);

写这个约束的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

约束应该是这样的:

( director not in ('Steven Spielberg', 'James Cameron') or
  director is null   /*  if that is allowed  */         or
  director = 'Steven Spielberg' and movie_year < 1990   or
  director = 'James Cameron'    and movie_year > 1990       )

如果您不相信开发人员对AND和OR的优先级非常熟悉和熟悉,则可以在第3行和第4行的AND分隔条件周围使用括号。

答案 1 :(得分:0)

您可以在CHECK约束中use a CASE statement

ALTER TABLE movie_16bce1346 
ADD CONSTRAINT check_year CHECK
  (CASE
    WHEN director = 'Steven Spielberg' AND movie_year > 1990 THEN 1 
    WHEN director = 'James Cameron' AND movie_year < 1990 THEN 1
    WHEN director NOT IN ('Steven Spielberg', 'James Cameron') THEN 1
    ELSE 0 END = 1);

CASE捕获您的条件,需要返回1或0.&#34; END = 1&#34;说CASE的结果需要等于1。