2014-01-23 31 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,但我还没有测试过。