添加检查和的约束

use*_*882 5 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)
  );
Run Code Online (Sandbox Code Playgroud)

我需要检查每个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
Run Code Online (Sandbox Code Playgroud)

在这里,当我将eid 0的第三个条目添加为sum> 100时,它应该出错。
对于eid 1和2,因为pct_time <= 100
会很好。这怎么办?

到目前为止,我所做的只是

ALTER TABLE Works
ADD CONSTRAINT c1
CHECK SUM(pct_time) < 100
Run Code Online (Sandbox Code Playgroud)

dee*_*see 5

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

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

编辑:在此处查看触发器的文档。基本上你想要的是这样的:

CREATE TRIGGER Work_insert_trigger
BEFORE INSERT ON Works
FOR EACH ROW
EXECUTE PROCEDURE check_sum_work();
Run Code Online (Sandbox Code Playgroud)

然后你的check_sum_work()程序将检查是否有 SUM(pct_time) > 100。

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

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

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