具有来自另一个表的条件的数据库约束

时间:2019-05-01 03:43:58

标签: database constraints

我想基于另一个表条件创建数据库约束。我正在使用postgres数据库。

TableA

id     value    
7890    none
2345    none
1394    change
2412    none
5432    change

TableB

rank    name      table-a-id    category
29      David         7890         A
13      May           2345         A
10      Charles       1394         B  
01      Rose          2412         A
62      Robby         5432         B

当表A的值=更改时,我需要对数据库进行约束,然后表B的类别必须为B。

到目前为止我的尝试:

ALTER TABLE TableB ADD CHECK (SELECT 1 FROM TableA a, TableB b where a.value = "change" and b.category = "B")

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

至少在最新版本的Postgres中,不可能在检查约束内使用查询。但是,我们可以尝试通过触发器来解决此问题:

CREATE OR REPLACE FUNCTION check_table_a()
RETURNS TRIGGER AS
$$
BEGIN
IF NOT EXISTS (SELECT 1 FROM TableB b
    WHERE b.category = 'B' AND b.table-a-id = NEW.id)
THEN Raise Exception 'TableA id % does not have B category', NEW.id;
END IF;
RETURN NEW;
END;
$$ LANGUAGE PLpgSQL;

CREATE TRIGGER check_me
BEFORE UPDATE ON TableA
FOR EACH ROW EXECUTE PROCEDURE check_table_a();