2013-11-02 61 views
1

以下是我的環境:我的db包含一些與選舉有關的數據。 每次選舉都有開始時間和結束時間,在此期間,人們可以爲某人投票。在特定日期執行自動操作

我想這樣做,當結束時間發生時,DB使得計票結果,並根據誰的票數最多的用戶自動設置一個表上的贏家場。 必須將此事件添加到插入「選舉」表中的每個新行中,顯然,每行都會有不同的結束時間。

是否有可能創建一個觸發器到達日期時間時,誰喚醒?

+0

您可以查看[pgAgent](http://www.pgadmin.org/download/pgagent.php)。 – zero323

+0

我想以代碼的形式執行 – Phate

+1

對於您的問題的回答「是否可以創建在達到日期時間時喚醒的觸發器」爲「否」。您必須使用外部流程來觸發操作。 – bma

回答

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; 

但是請記住,可以有不止一個贏家當一個以上的候選人將獲得相同票數。