我的触发器如下所示:
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 ;
一切正常! :-)我认为课程永远不会使用反引号/反引号(`),除非严格要求。
答案 0 :(得分:1)
问题是后引号/反引号(`)
问题不在于背包,而在于你不正确地使用它们
...WHERE `id` = `NEW.id`
^ ^
通过这种方式编写,你告诉MySQL你要更新表中所有在两个列id
和NEW.id
中具有相同值的行。是的,如果您愿意,可以使用具有此名称的列。这是一个 SQLFiddle 演示。
NEW
关键字不应该被重新添加id
)时,您需要反对对象标识符仅(在您的情况下为<table>.<column>
)。写得正确它应该看起来像这样
...WHERE `id` = NEW.`id`
^ ^
如果您没有在数据库对象标识符中使用受限制的字符或保留字,则无需使用backtiks。
答案 1 :(得分:0)
问题是后引号/反引号(`)。查看原始问题的编辑