在MySql触发器中,引用保留字列名的正确语法是什么


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

语法错误发生在";旧的。CCD_ 1";因为comment是MySql中的保留字,而且它在OLD之后,所以上面的查询即使使用backtick("`"(也不起作用。

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

错误消息为: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中跳过。

最新更新