2011-02-20 161 views
0

如何在觸發器中停止Event。例如:我有下面這個簡單的代碼:MySQL在觸發器中停止事件

CREATE TRIGGER checkPlayer BEFORE INSERT ON players 

BEGIN 

    DECLARE ctr INT; 

    SELECT count(*) 
    INTO ctr 
    FROM players 
    WHERE fName = NEW.fName 
    AND lName = NEW.lName; 

    IF ctr > 0 THEN 
    -- LEAVE and don't insert because player exists 
    END IF; 

END 

回答

1

MySQL使用SIGNAL這樣的事情:

信號「重返」錯誤的方式。 SIGNAL向處理程序,應用程序的外部或客戶端提供錯誤信息。此外,它還提供對錯誤特徵(錯誤號,SQLSTATE值,消息)的控制。如果沒有SIGNAL,有必要使用變通方法,例如故意引用不存在的表來導致例程返回錯誤。

任何error conditional in a BEFORE trigger(包括,據我所知,適當SIGNAL值)將中止觸發器以及觸發觸發器的語句。如果你的MySQL版本不支持SIGNAL(即你的版本低於5.5),那麼你將不得不以另一種方式觸發錯誤,比如舊的「從不存在的表中選擇」或者破解"violate a PK by a double INSERT"

我只有5.1方便,所以我無法驗證SIGNAL的東西。 「19.3.1。觸發器語法」的相關部分對於5.1,5.2和5.5是相同的,儘管如此,如果你需要訴諸這些東西,那麼「觸發一個錯誤」的一個問題應該可以工作。

+0

謝謝隊友,我一直在尋找一個詞來搜索,這實際上是你說的「信號」,真的有幫助 – bluezald

1

我有一個迷你博客文章解釋示例代碼的信號。點擊here。而不是通過插入兩個具有相同主鍵的條目來生成異常,也可以使用divide by 0異常,該異常不涉及數據庫中的插入語句。