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)
您应该为此使用触发器。让它检查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 触发器的另一个示例。