这是我的环境:我的数据库包含一些与选举相关的数据。每次选举都有开始时间和结束时间,在此期间人们可以投票给某人。
我想这样做,当结束时间发生时,数据库进行投票计数,并根据获得最多选票的用户自动在表格上设置获胜者字段。必须将此事件添加到“选举”表中插入的每个新行中,显然,每一行都有不同的结束时间。
是否可以创建一个在到达日期时间时唤醒的触发器?
这是我的环境:我的数据库包含一些与选举相关的数据。每次选举都有开始时间和结束时间,在此期间人们可以投票给某人。
我想这样做,当结束时间发生时,数据库进行投票计数,并根据获得最多选票的用户自动在表格上设置获胜者字段。必须将此事件添加到“选举”表中插入的每个新行中,显然,每一行都有不同的结束时间。
是否可以创建一个在到达日期时间时唤醒的触发器?
您只能使用cron
或pgAgent
类似的作业调度程序执行此类操作。
但你不必这样做。只需使用如下表格:
create table election_candidates (
election_id int not null references elections(election_id),
user_id int not null references users(user_id),
votes int not null default 0
);
create index election_candidates_election_id_votes_idx
on election_candidates(election_id, votes);
When election is started you create election_candidates
row for every candidate with votes=0
. 当您收到投票时,您只需使用update election_candidates set votes=votes+1 where election_id=? and user_id=?
. 如果您需要记录投票而不是在另一个表中记录并使用触发器更新此表。
当您需要检查获胜者时,您只需使用:
with max_votes as (
select election_id, max(votes) as max_vote from election_candidates
where election_id=?
group by election_id
)
select user_id from election_candidates
natural inner join max_votes
where votes=max_vote;
但请记住,当不止一名候选人获得相同数量的选票时,可能会有不止一名获胜者。