触发器中的MySQL错误“'新'中的未知列”

时间:2014-01-23 19:24:29

标签: mysql sql triggers mysql-error-1054

我在MySQL中遇到了一个与“before insert trigger”不一致的错误,并且无法找出原因。

我有一张包含以下描述的表格:

+-----------+---------------+------+-----+---------+-------+
| 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'

当发生此错误时,它将不会停止,直到我删除并使用完全相同的语句重新创建触发器。当我这样做时,错误停止发生并且几次插入都没有问题,直到相同的问题返回时显然没有理由。

有人可以帮我解决这个问题吗? 提前谢谢。

2 个答案:

答案 0 :(得分: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中已得到修复,但我还没有对此进行测试。

答案 1 :(得分:1)

如果您无法修复此问题,则可能需要创建一个每隔几分钟运行一次存储过程的cron作业。这是黑客攻击,但它可以帮助您确定问题。可能是数据库使用量最大化了吗?您是否检查了操作系统,以查看发生此错误时发生的情况。您还应该检查日志文件是否有错误。我已经看到错误累积到他们开始干扰数据库的程度。

另一种可能性是,您要插入包含许多索引的大表中的表吗?如果插入引起延迟,则可能导致触发器出现瓶颈。