【问题标题】:Check constraint with condition用条件检查约束
【发布时间】:2016-12-16 22:30:24
【问题描述】:

我想知道这个条件是否可以通过检查约束来完成,或者我是否需要创建触发器。

条件:如果学生录取日期不为空,则考试成绩为空

备注:Containt case OR Trigger

我尝试了什么:

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"

【问题讨论】:

  • 我纠正了缺失的结尾

标签: sql oracle oracle11g constraints ddl


【解决方案1】:

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

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

【讨论】:

  • 它返回一个错误:无法验证 (SYSTEM.AAAA) - 违反检查约束
  • @DavidEdgar 这意味着您的数据与要求不一致。您应该修复它,或者将约束声明为最初延迟。
  • 在我的表 ADMITED_TABLE 中,两列是这样的(dateadmited DATE, MARK INTEGER)。创建表时没有NOT NULL OR NULL。
  • @Mureinik - 为什么这么复杂?更简单:(dateadmitted is null or mark is null)
  • @DavidEdgar 这将解决您的问题,但只是部分解决。如果表中已经有行,其中两个值都是非 NULL,它们将继续存在于表中;只有新行会受到约束(以及对现有行的修改)。您 - 或您的企业 - 将选择对违反约束的现有行执行什么操作是一个单独的业务决策(可能为您和您的团队做更多工作)。
【解决方案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);

【讨论】:

    【解决方案3】:

    从问题中的描述看来,您想要的是触发器,而不是约束。约束让您验证表中的值是否符合您的预期;但是,约束不能更改列的值。因此,如果您只是想验证提供的值是否符合您的规则,则 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;
    

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多