2014-01-23 50 views
7

我在MySQL中有一個」之前插入觸發器「的不一致錯誤,無法找出原因。觸發器中的MySQL錯誤「NEW」中的未知列「

我有以下描述的表:

+-----------+---------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+-----------+---------------+------+-----+---------+-------+ 
| ROW_ID | int(11)  | NO | PRI | 0  |  | 
| ID  | int(11)  | NO | UNI | NULL |  | 
| TITLE  | varchar(32) | NO |  | NULL |  | 
| TEXT  | varchar(500) | NO |  | NULL |  | 
| URL  | varchar(200) | YES |  | NULL |  | 
| MINUTE_IN | int(11)  | YES |  | NULL |  | 
| SECOND_IN | int(11)  | YES |  | NULL |  | 
| TVSHOW_ID | int(11)  | NO | MUL | NULL |  | 
| IMAGE  | varchar(4000) | YES |  | NULL |  | 
+-----------+---------------+------+-----+---------+-------+ 

而且我用下面的語句觸發器:

delimiter $$ 
CREATE TRIGGER ACTIVATE_IRT_CONTENT BEFORE INSERT ON WEXTRAS_CONTENT 
FOR EACH ROW 
BEGIN 
    IF (SELECT s.ACTIVE 
     from WEXTRAS_TVSHOW s 
     where s.id = NEW.tvshow_id) = 1 AND NEW.MINUTE_IN = 0 AND NEW.SECOND_IN = 0 
    THEN SET NEW.MINUTE_IN = TIMESTAMPDIFF(MINUTE,(select INIT_TIME from WEXTRAS_TVSHOW s 
                where s.id = NEW.tvshow_id 
                ),sysdate()); 
     SET NEW.SECOND_IN = SECOND(SEC_TO_TIME(TIMESTAMPDIFF(SECOND,(select INIT_TIME from WEXTRAS_TVSHOW s 
                    where s.id = NEW.tvshow_id 
                    ),sysdate()))); 
    END IF; 
END$$ 

delimiter ; 

的問題是,有時返回以下錯誤:

'NEW'中的未知列'MINUTE_IN'

發生此錯誤時,它不會停止,直到我刪除並使用完全相同的語句重新創建觸發器。當我這樣做時,錯誤停止發生,並且幾次插入將毫無問題地發生,直到同樣的問題返回,顯然沒有理由。

有人可以幫我解決這個問題嗎? 在此先感謝。

+0

爲什麼你的IF條件中有3個額外的分號?和其他地方的其他分號,我會認爲它會抱怨語法錯誤。 –

+0

糟糕...這實際上是一個複製/粘貼錯誤,當恢復一些過去的嘗試,看看問題是不會再發生。 我編輯了我的原始文章以糾正它。 對不起...... – barras

+2

+1我想知道答案是什麼,因爲我認爲你已經發現了一個非常奇怪的錯誤。 –

回答

1

如果您無法修復此問題,則可能需要創建一個每隔幾分鐘運行一次存儲過程的cron作業。這是黑客攻擊,但它可以幫助您識別問題。它可能是數據庫使用最多?您是否檢查操作系統以查看發生此錯誤時發生的情況。您還應該檢查日誌文件是否有錯誤。我已經看到了錯誤,直到他們開始干擾數據庫。

另一種可能性,是你插入到一個有很多索引的大表中的表?如果插入引起延遲,可能會導致觸發器出現瓶頸。

2

有在觸發的MySQL 5.6.17中的錯誤,當你引用已被截斷的另一個表:http://bugs.mysql.com/bug.php?id=72446

也許這是什麼原因呢?我嘗試通過將TRUNCATE table_name更改爲DELETE FROM table_name來解決此問題(其中,table_name是我的觸發器從中獲取數據的表,即:如果表A上引用了表B的觸發器,該錯誤可以發生在截斷表B時)。

此外,該錯誤報告似乎表明,這是固定在MySQL 5.6.19,但我還沒有測試過。