从行的总和约束

时间:2016-05-09 13:20:44

标签: postgresql postgresql-9.4

我在PostgreSQL 9.4中有一张表:

user_votes (
  user_id int,
  portfolio_id int,
  car_id int
  vote int
)

是否可以对表格施加约束,以便用户最大可以在每个投资组合中投票99点? 这意味着用户可以拥有多个行,这些行包含相同的user_id和portfolio_id,但不同的car_id和vote。投票金额不应超过99,但可以放在不同的汽车中。

这样做:

INSERT INTO user_vores (user_id, portfolio_id, car_id, vote) VALUES
    (1, 1, 1, 20),
    (1, 1, 7, 40),
    (1, 1, 9, 25)

将被允许,但是当试图添加超过99票的东西时,应该失败,就像另一行:

    INSERT INTO user_vores (user_id, portfolio_id, car_id, vote) VALUES
    (1, 1, 21, 40)

1 个答案:

答案 0 :(得分:2)

不幸的是,如果您尝试创建此类constraint,则会看到以下错误消息:

User.where(first_name: 'James', last_name: 'Scott')
    .or(User.where(email: 'james@gmail.com'))

但关于postgresql的精彩之处在于,总有不止一种方法可以给猫皮肤涂抹。您可以使用BEFORE trigger来检查您尝试插入的数据是否满足我们的要求。

  

触发行级触发器BEFORE可以返回null来发出触发信号   经理跳过这一行的其余操作(即   不会触发后续触发器,INSERT / UPDATE / DELETE会触发   不会出现这一行)。如果返回一个非空值,那么   操作以该行值继续。

在触发器内部,您将计算投票数

ERROR: aggregate functions are not allowed in check constraints

现在,如果vote_count为99,则返回NULL并且不会插入数据。