2012-09-26 48 views
1

我有兩張表,圓形和事件。一輪有許多事件。在MySQL觸發器中比較日期

create table round (
    round_id INTEGER AUTO_INCREMENT NOT NULL, 
    round_start_date DATETIME NOT NULL, 
    round_end_date DATETIME NOT NULL, 
    CONSTRAINT round_pk PRIMARY KEY (round_id) 
); 

create table event (
    event_id INTEGER AUTO_INCREMENT NOT NULL, 
    round_id INTEGER NOT NULL, 
    event_date DATETIME NOT NULL, 
    CONSTRAINT event_pk PRIMARY KEY (event_id), 
    CONSTRAINT round_fk FOREIGN KEY (round_id) REFERENCES round (round_id), 
); 

當行插入事件表,我想用一個觸發新插入的行的EVENT_DATE領域比較在圓桌其相應的條目round_start_date和round_end_date領域。如果event_date早於round_start_date,則應使用新的event_date更新round_start_date。如果event_date在round_end_date之後,則應使用新的event_date更新round_end_date。

這是我的觸發器。它不起作用,我不明白爲什麼。我無法在網上找到其他人試圖在觸發器中使用日期時間類型的任何地方,因此我沒有任何參考資料可以指出我出錯的地方。

create trigger update_round_date 
after insert on event for each row 
begin 
    declare curSdate datetime; 
    declare curEdate datetime; 
    set curSdate = (select round_start_date from round where round_id = NEW.round_id); 
    set curEdate = (select round_end_date from round where round_id = NEW.round_id); 
    if (NEW.event_date < curSdate) then 
     update round set round_start_date = NEW.event_date where round_id = NEW.round_id; 
    else if (NEW.event_date > curEdate) then 
     update round set round_end_date = NEW.event_date where round_id = NEW.round_id; 
    end if; 
end; 

編輯:我根本無法創建觸發器。 phpMyAdmin給了我這個錯誤: 「#1064 - 你的SQL語法錯誤;檢查對應於你的MySQL服務器版本的手冊,在第4行使用正確的語法」

編輯2:用分隔符更新設置

DELIMITER $$ 
create trigger update_round_date 
after insert on event for each row 
begin 
    declare curSdate datetime; 
    declare curEdate datetime; 
    set curSdate = (select round_start_date from round where round_id = NEW.round_id); 
    set curEdate = (select round_end_date from round where round_id = NEW.round_id); 
    if (NEW.event_date < curSdate) then 
     update round set round_start_date = NEW.event_date where round_id = NEW.round_id; 
    else if (NEW.event_date > curEdate) then 
     update round set round_end_date = NEW.event_date where round_id = NEW.round_id; 
    end if; 
end$$ 

這將返回錯誤:「#1064 - 你在你的SQL語法錯誤;檢查對應於您的MySQL服務器版本在使用‘’附近正確語法手冊第13行「

+0

你是否收到任何錯誤,或者它是否更新奇怪的行? –

+0

這是phpMyAdmin在我嘗試創建觸發器時給出的錯誤:#1064 - 您的SQL語法錯誤;請檢查與您的MySQL服務器版本相對應的手冊,以便在第4行的「'附近使用正確的語法。 –

+1

可能忘記將您的分隔符設置爲」;「以外的內容第一? –

回答

1

MySQL是在第一可能停止「;」,解釋你的命令:

create trigger update_round_date 
after insert on event for each row 
begin 
    declare curSdate datetime; 

你有你的分隔符先設置到別的東西,然後終止與分隔符CREATE TRIGGER命令代替(並把分隔符回末):

delimiter^

create trigger update_round_date 
after insert on event for each row 
begin 
    ... 
end; 

^ 

delimiter ; 

我相信最後的分號後end可能是必要的。

+0

無論我如何編寫它,仍然會給我提供相同的錯誤消息。 –

+0

我認爲值得一提的是,在phpMyAdmin中,第13行和第14行的「結尾」沒有像其他關鍵字那樣突出顯示。 –

+0

儘管Devart的回答是第一位的,但我將這一個標記爲答案,因爲這個幫助我修復了我的觸發器,所以我明白了我做錯了什麼。 –

1

phpmyadmin中的分隔符可能有問題,請嘗試使用此觸發器 -

CREATE TRIGGER trigger1 
AFTER INSERT 
ON event 
FOR EACH ROW 
    UPDATE 
    round 
    SET 
    round_start_date = 
     IF(NEW.event_date < round_start_date, NEW.event_date, round_start_date), 
    round_end_date = 
     IF(NEW.event_date > round_end_date, NEW.event_date, round_end_date) 
    WHERE 
    round_id = NEW.round_id; 
+0

這工作,但我仍然想知道爲什麼我原來的嘗試(並與分隔符設置)不起作用。 –

+0

據我所知,舊的phpmyadmin版本不支持腳本與源對象 - 過程,觸發器,其中BEGIN ... END子句符合。如果你要在另一個MySQL客戶端運行它,你的觸發器也應該工作。 – Devart

+0

我使用phpMyAdmin v3.5.2.2,我相信它是最新的可用版本。 –