检查约束条件

时间:2016-12-16 22:30:25

标签: sql oracle oracle11g constraints ddl

我想知道这种情况是否可以通过检查约束来完成,还是我需要创建一个触发器。

条件:如果学生申请日期不为空,则考试标记为空

备注:保护案例或触发

我尝试了什么:

ALTER TABLE ADMITED_TABLE
ADD CONSTRAINT AAAA CHECK
 ( CASE  WHEN  DATEADMITED IS NOT NULL THEN MARK NULL END);

错误:

ORA-00920: invalid relational operator
00920. 00000 -  "invalid relational operator"

3 个答案:

答案 0 :(得分:2)

检查约束采用布尔条件,因此您必须以这种条件的形式构造此逻辑:

ALTER TABLE ADMITED_TABLE
ADD CONSTRAINT AAAA CHECK
(dateadmited IS NULL OR mark IS NULL);

答案 1 :(得分:2)

我必须误读大卫的要求,因为我的解决方案是:

ALTER TABLE admitted_table
    ADD CONSTRAINT aaaa CHECK
            ( (dateadmitted IS NOT NULL
           AND mark IS NULL)
          OR dateadmitted IS NULL);

以下是我的测试用例:

-- Succeeds
INSERT INTO admitted_table (
           dateadmitted, mark
            )
     VALUES (SYSDATE, NULL);

-- Fails due to check constraint
INSERT INTO admitted_table (
           dateadmitted, mark
            )
     VALUES (SYSDATE, 10);

-- Succeeds
INSERT INTO admitted_table (
           dateadmitted, mark
            )
     VALUES (NULL, 99);

答案 2 :(得分:1)

从问题中的描述看来,您想要的是触发器,而不是约束。通过约束,您可以验证表中的值是否符合预期;但是,约束不能更改列的值。因此,如果您只是想验证提供的值是否符合规则,则CHECK约束就足够了。如果您希望(可能)更改MARK列的值,则需要使用触发器,例如:

CREATE OR REPLACE ADMITED_TABLE_BIU
  BEFORE INSERT OR UPDATE ON ADMITED_TABLE
  FOR EACH ROW
BEGIN
  IF :NEW.DATEADMITED IS NOT NULL THEN
    :NEW.MARK := NULL;
  END IF;
END ADMITED_TABLE_BIU;

祝你好运。