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

Posted

技术标签:

【中文标题】触发器中的 MySQL 错误“\'NEW\' 中的未知列”【英文标题】:MySQL error in Trigger "Unknown column in 'NEW'"触发器中的 MySQL 错误“'NEW' 中的未知列” 【发布时间】:2014-02-14 13:15:24 【问题描述】:

我在 mysql 中遇到与“插入前触发器”不一致的错误,无法找出原因。

我有一张桌子,描述如下:

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

发生此错误时,它不会停止,直到我使用完全相同的语句删除并重新创建触发器。当我这样做时,错误就会停止发生,并且会毫无问题地发生几次插入,直到同样的问题毫无理由地再次出现。

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

【问题讨论】:

为什么你的 IF 条件中有 3 个额外的分号?和其他地方的其他分号,我原以为它会抱怨语法错误。 糟糕...当恢复过去的一些尝试以查看问题是否不再发生时,这实际上是一个复制/粘贴错误。我编辑了我的原始帖子以更正它。对不起... +1 我也想知道答案是什么,因为我认为您发现了一个非常奇怪的错误。 我无法重现该问题,没有生成错误。您使用的是什么版本的 MySQL? SQL Fiddle Test 我在 CentOS 64 位机器上使用 5.6.15。我也开始认为这可能是一个 MySQL 错误。我也不能总是复制错误...这种行为似乎很随机... 【参考方案1】:

当您引用另一个已被截断的表时,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 中修复,但我尚未对此进行测试。

【讨论】:

【参考方案2】:

如果您无法修复此问题,那么您可能必须创建一个每隔几分钟运行一次存储过程的 cron 作业。这是 hack,但它可以帮助您识别问题。会不会是数据库使用率被最大化了?您是否检查了操作系统以查看发生此错误时发生的情况。您还应该检查您的日志文件是否有错误。我已经看到错误累积到开始干扰数据库的地步。

另一种可能性,您要插入的表是否是具有许多索引的大表?如果插入导致延迟,则可能会导致触发器出现瓶颈。

【讨论】:

以上是关于触发器中的 MySQL 错误“'NEW' 中的未知列”的主要内容,如果未能解决你的问题,请参考以下文章

mysql触发器中的语法错误

phpmyAdmin 中的 MySQL 触发器错误

mysql中的触发器出现错误

引发错误,防止 MySQL 触发器中的表更新

纠正我在 mysql 触发器中的语法错误

mysql中的触发器收到错误