【问题标题】:Add contraint that checks sum添加检查总和的约束
【发布时间】:2011-05-15 14:02:00
【问题描述】:

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

例如

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 的第三个条目添加为总和 > 100 时,它应该出错了。
对于 eid 1 和 2 来说 pct_time 会很好 如何做到这一点?

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

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

【问题讨论】:

    标签: sql database postgresql constraints


    【解决方案1】:

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

    【讨论】:

    • 不,我不熟悉触发器。我正在使用 postgres。
    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多