首页 > 解决方案 > 为子表中的列添加检查约束

问题描述

我有 2 张桌子

帐户:

ID (NUMBER), type_of_acc (VARCHAR), (only values ADMIN or USER);

禁止:

ID_A(NUMBER), ID_U(NUMBER); 

两者ID_A和都是从 tableID_U引用的外键。IDAccount

我需要添加一个检查 ID_A 只有值 ID 的约束

WHERE type_of_acc = 'ADMIN'

            

标签: sqloracle

解决方案


正如您在Oracle 文档CHECK中看到的那样,在您的用例中,由于多种原因,您无法执行约束条件,特别是因为:

检查约束的条件可以引用表中的任何列,但不能引用其他表的列。

和:

检查约束条件不能包含以下结构:

  • 子查询和标量子查询表达式
  • 调用用户定义的函数

为了在功能上实现这一点,可能要走的路是为您的BAN表创建一个触发器。例如考虑:

CREATE OR REPLACE TRIGGER tg_ban_boiu
BEFORE INSERT OR UPDATE
ON BAN  
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
  v_aux NUMBER;
BEGIN
  IF :NEW.id_a IS NOT NULL THEN
    SELECT COUNT(*) INTO v_aux
      FROM account
     WHERE id = :NEW.id_a
       AND type_of_acc = 'ADMIN';

    IF v_aux = 0 THEN
      RAISE_APPLICATION_ERROR(-20001, 'Invalid value for ID_A');
    END IF;
  END IF;
END;

推荐阅读