添加检查总和的约束

时间:2011-05-15 14:02:00

标签: 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.
对于eid 1和2来说,这将是正常的,因为pct_time< = 100
怎么办呢?

到目前为止,我所做的一切都是

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

1 个答案:

答案 0 :(得分:4)

您应该使用触发器。在插入后检查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)&gt; 100。

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

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

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