我正在尝试通过检查某个值的总和是否小于 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/