Database 具有另一个表中的条件的数据库约束

Database 具有另一个表中的条件的数据库约束,database,constraints,Database,Constraints,我想创建一个基于另一个表条件的数据库约束。我正在使用postgres数据库 表 id value 7890 none 2345 none 1394 change 2412 none 5432 change 表B rank name table-a-id category 29 David 7890 A 13 May 2345 A 10

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

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

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的值=change时,我需要做一个数据库约束,那么表B必须有category=B

我迄今为止的努力:

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

任何建议都将不胜感激

至少在最新版本的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();

你需要用扳机来做这件事。约束只能查看它自己的行。使用触发器,您可以查看其他表。您可以使用检查约束中的函数作为well@a_horse_with_no_name如果你觉得很宽宏大量,你可以用这个选项编辑我的答案(或发布另一个答案)。@TimBiegeleisen我有点困惑,表a的连接在哪里,新表是从哪里来的?@Matt pow我的触发器不使用连接。阅读有关
新的