我想创建一个基于另一个表条件的数据库约束。我正在使用 postgres 数据库。
表A
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值=变化时,表B必须有类别=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();
关于具有来自另一个表的条件的数据库约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55931358/