sql - 添加检查总和的约束

标签 sql database postgresql constraints

我正在尝试通过检查某个值的总和是否小于 100 来向表添加约束。

这是我的模式:

  CREATE TABLE Works  (
     eid      INTEGER,
     did      INTEGER,
     pct_time INTEGER,
     PRIMARY KEY (eid,did),
     FOREIGN KEY (eid) REFERENCES Employee(eid),
     FOREIGN KEY (did) REFERENCES Dept(did)
  );

我需要检查每个 eid 的 pct_time 总和 <= 100。

例如

eid --- did ---- pct_time
0 ----- a ------- 50
0 ----- d ------- 40
0 ----- c ------- 20
1 ----- a ------- 90
1 ----- b ------- 10
2 ----- d ------- 40
2 ----- a ------- 20

在这里,当我添加 eid 0 的第 3 个条目作为总和 > 100 时应该出错。
如果 pct_time <= 100
对于开斋节 1 和开斋节 2 就没问题了 如何做到这一点?

到目前为止我所做的就是

ALTER TABLE Works
ADD CONSTRAINT c1
CHECK SUM(pct_time) < 100

最佳答案

您应该为此使用触发器。让它检查 SELECT SUM(pct_time) FROM Works GROUP BY eid 是否有任何值在插入后会超过 100。如果是这种情况,则抛出错误。

您熟悉触发器吗?您使用的是什么数据库系统?

编辑: 查看触发器的文档 here .基本上你想要的是这样的:

CREATE TRIGGER Work_insert_trigger
BEFORE INSERT ON Works
FOR EACH ROW
EXECUTE PROCEDURE check_sum_work();

然后您的 check_sum_work() 过程将检查是否有任何 SUM(pct_time) > 100。

Here是触发器过程的文档,请注意 NEW 特殊变量,它允许您挑出要插入的元素。因此,您需要 SELECT SUM(pct_time) FROM Works WHERE eid = NEW.eid 并查看该总和 + NEW.pct_time 是否大于 100。

如果您以前从未见过触发器,这可能听起来很复杂,但它实际上是一种您将学会欣赏的非常强大的机制。 :)

Here是另一个使用 PostgeSQL 触发器的例子。

关于sql - 添加检查总和的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6008838/

相关文章:

postgresql - 如何从函数本身内部获取调用函数的语句?

mysql - 如何将 SQL 查询转换为 JSON 格式

php - 解析错误 : Syntax error, SQL 查询出现意外的 T_String 问题

SQL Server GROUP BY 困境

mysql - 从 latlang 计算距离 --MySQL 功能错误 (#1064)

php - 在长时间的过程中连接丢失以在数据库 sqlite3 codeigniter 中保存记录

PostgreSQL 命令不列出所有模式

php - 将用户分配到我的 PHP 应用程序中的多个项目,最佳方法?

javascript - 如何在javascript中获取sqlite数据库值

mysql - 另一个表中存在的引用数 - PostgreSQL