触发器导致#1054 - 'where子句'中的未知列'x'

时间:2015-01-16 00:21:58

标签: mysql triggers mysql-error-1054

我的触发器如下所示:

DROP TRIGGER IF EXISTS `trigger_name`;
DELIMITER //
CREATE TRIGGER `trigger_name` 
AFTER UPDATE ON `table1`
 FOR EACH ROW UPDATE `table2` SET `modified` = CURRENT_TIMESTAMP WHERE `id` = `NEW.id`
//
DELIMITER ;

如果执行此操作,则会因上述错误(#1054)崩溃:

UPDATE table1 SET owner = NULL WHERE id = 82

找到解决方案!问题是后引号/反引号(`)。如果我像

那样重写触发器
DROP TRIGGER IF EXISTS trigger_name;
DELIMITER //
CREATE TRIGGER trigger_name
AFTER UPDATE ON table1
 FOR EACH ROW UPDATE table2 SET modified = CURRENT_TIMESTAMP WHERE id = NEW.id
//
DELIMITER ;

一切正常! :-)我认为课程永远不会使用反引号/反引号(`),除非严格要求。

2 个答案:

答案 0 :(得分:1)

  

问题是后引号/反引号(`)

问题不在于背包,而在于你不正确地使用它们

...WHERE `id` = `NEW.id`
                ^      ^

通过这种方式编写,你告诉MySQL你要更新表中所有在两个idNEW.id中具有相同值的行。是的,如果您愿意,可以使用具有此名称的列。这是一个 SQLFiddle 演示。

  1. NEW关键字不应该被重新添加
  2. 当您使用点表示法(id)时,您需要反对对象标识符(在您的情况下为<table>.<column>)。
  3. 写得正确它应该看起来像这样

    ...WHERE `id` = NEW.`id`
                        ^  ^
    

    如果您没有在数据库对象标识符中使用受限制的字符或保留字,则无需使用backtiks。

答案 1 :(得分:0)

问题是后引号/反引号(`)。查看原始问题的编辑