【问题标题】:In MySql triggers, what is the correct syntax for referring to a column name which is a reserved word?在 MySql 触发器中,引用作为保留字的列名的正确语法是什么?
【发布时间】:2022-01-21 03:14:28
【问题描述】:
CREATE TRIGGER `db_name`.`trigger_name` BEFORE DELETE ON `db_name`.`table1_name` 
FOR EACH ROW 
BEGIN 
INSERT INTO `db_name`.`table2_name`(table2_id,`comment`,record_created_date) 
VALUES (OLD.id, OLD.`comment`, NOW()); 
END

语法错误发生在“OLD.comment”,因为 comment 是 MySql 中的保留字并且在 OLD 之后,即使使用反引号(“`”),上面的查询也不起作用.

当然,最简单的解决方案是更改列名。但是,就我而言,这不是一个选择。 如果您知道正确的语法,请提供帮助。谢谢。

【问题讨论】:

  • 我认为这将是(table2_id, `comment`, record_created_date) 上插入列列表中的comment 引用...而不是OLD 引用?
  • 不,不是。至少,HeidiSQL 不认为那里有语法错误。
  • 您是如何使用反引号尝试 OLD 引用的?
  • 如果 OLD 可以用其他东西代替,它可能会起作用。就我而言,OLD.comment 包含两个保留关键字。我认为 OLD 是这里的问题。
  • 我尝试了所有的组合——在 OLD 周围加上反引号,在评论周围,在两者周围......

标签: mysql triggers keyword reserved


【解决方案1】:

错误消息是:SQL 错误 (1064):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在第 5 行的 '' 附近使用的正确语法。

第 5 行是代码中包含第一个分号的行。您忘记了 DELIMITER 重新分配。

所以

DELIMITER ;;

CREATE TRIGGER `db_name`.`trigger_name` BEFORE DELETE ON `db_name`.`table1_name` 
FOR EACH ROW 
BEGIN 
INSERT INTO `db_name`.`table2_name`(table2_id,`comment`,record_created_date) 
VALUES (OLD.id, OLD.`comment`, NOW()); 
END
;;

DELIMITER ;

但是您的触发器仅包含一个语句,因此请删除 BEGIN 和 END 行。在这种情况下不需要重新分配 DELIMITER。

CREATE TRIGGER `db_name`.`trigger_name` BEFORE DELETE ON `db_name`.`table1_name` 
FOR EACH ROW 
INSERT INTO `db_name`.`table2_name`(table2_id,`comment`,record_created_date) 
VALUES (OLD.id, OLD.`comment`, NOW()); 

PS。对 db_name.table2_name.record_created_date 列使用自动使用 (DEFAULT CURRENT_TIMESTAMP),您可以将其从 INSERT 中跳过。

【讨论】:

  • 是的,这解决了我的问题!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
相关资源
最近更新 更多