我在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)
答案 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并且不会插入数据。