在特定日期执行自动操作

时间:2013-11-02 15:23:11

标签: database postgresql

这是我的环境:我的数据库包含一些与选举有关的数据。 每次选举都有一个开始时间和一个结束时间,在此期间人们可以投票给某人。

我想这样做,当结束时间发生时,数据库进行计票并根据获得最多投票的用户自动在表上设置赢家字段。 必须将此事件添加到“选举”表中插入的每个新行,显然每行的结束时间不同。

是否可以创建在达到日期时间时唤醒的触发器?

1 个答案:

答案 0 :(得分:1)

您只能使用cronpgAgent或类似的作业调度程序执行此类操作。

但你不必这样做。只需使用如下表格:

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);

当选举开始时,您为election_candidates的每位候选人创建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;

但请记住,当多名候选人获得相同票数时,可能会有多名获胜者。