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

标签 database constraints

我想创建一个基于另一个表条件的数据库约束。我正在使用 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/

相关文章:

mysql - 由于违反完整性约束,Propel 无法删除

neo4j - Neo4J 约束中的非空属性

mysql - 迁移超过旧数据库值的新数据库

mysql - 如何存储sql表的图形

c# - 从 c# 到 Access DB 的 INSERT STATEMENT 中的语法错误

sql - ORACLE 根据两列查找计数

java - 检查 Java 中的 MySQL DB 中是否存在值?

swift - 我试图让这个输入 View 向上移动,这样当键盘出现时它不会消失

ios - UIViewControllerView 内的 UITableView 意外边距

ios - 以编程方式设置约束不适用于我的 TableView