检查约束 - 表中的所有行,每个客户端< = 100%(PostgreSQL)

时间:2010-08-09 16:19:38

标签: sql postgresql

我有一张桌子,可以为顾客存储类别组合。类别的数量可能会发生变化,但每个客户的细分数必须始终小于或等于100%。

custom     type_      pct  
-------    -------   -----  
Cust1      Type A    .33  
Cust1      Type B    .17  
Cust1      Type C    .50  
Cust2      Type A    .30  
Cust2      Type D    .10  
Cust2      Type E    .10  
Cust2      Type F    .50  

关于如何添加检查约束以强制执行此规则的任何想法? 这是我的开始......

ALTER TABLE cust_mix ADD CONSTRAINT ttl_pct_mix CHECK (SUM (pct) <= 1);  

但是这会检查所有行,而不管客户ID

2 个答案:

答案 0 :(得分:2)

仅通过添加约束,您将无法实现此目的。插入/更新后需要一个触发器来检查数据库端。

答案 1 :(得分:0)

不确定在PostgreSQL中是否可以使用SQL Server,但是,您实际上不必检查特定的客户ID以检查您的约束。您可以检查最大SUM是否有效。这可能有助于将其纳入约束。

例如:

(
    SELECT TOP 1
        SUM(pct)
    FROM
        cust_mix
    GROUP BY
        custom
    ORDER BY
        SUM(pct) DESC
) <= 1