MySQL 触发器创建执行无语法错误但未创建触发器,其他执行失败
MySQL Trigger Creation Executes Without Syntax Error but no trigger created, other executions fail
当 运行 创建触发器的查询时,我目前没有收到错误,但在 运行 它之后我无法执行另一个查询。好像我没有关闭一些封装:
DELIMITER // CREATE TRIGGER trigger_name BEFORE DELETE ON existingtable for each row begin INSERT INTO new_delete_table (column) values(old.column) end; END DELIMITER;
我正在使用命令行并开始于:
mysql>
我执行并收到一个新的:
mysql>
这是查询成功时的正常行为。如果我随后尝试查看我的触发器,我将陷入无限循环,等待我输入一些字符来关闭某些东西。
mysql> show triggers;
->
我可以使用 ctrl + c
退出该功能,但这也会让我退出 MySQL。当我重新登录时,我的触发器不存在,我找不到任何错误。
你的代码有一些错误
每个代码行都必须以分号结尾,而且你有一个 END 到很多
DELIMITER //
CREATE TRIGGER trigger_name BEFORE DELETE ON existingtable
for each row
begin
INSERT INTO new_delete_table (`column`) values
(old.column) ;
end//
DELIMITER;
DELIMITER
命令比较特殊。命令之后直到行尾的所有字符都被解释为要用作新分隔符的字符串。
您不能将代码放在同一行,因为所有这些代码都将成为新分隔符的一部分。这就是为什么没有错误,但没有执行 CREATE TRIGGER 语句的原因。它只是成为一个很长的分隔符字符串的一部分。
DELIMITER
必须将 end-of-line 解释为命令结束的原因是它不接受 ;
作为 DELIMITER
命令的结束.如果是这样,将无法将分隔符重置回 ;
.
您在评论中询问是否需要换行。除了 DELIMITER
命令后的换行符外,您不需要换行符。你可以这样做:
DELIMITER //
CREATE TRIGGER trigger_name BEFORE DELETE ON existingtable FOR EACH ROW BEGIN INSERT INTO new_delete_table (column) VALUES(old.column) END //
DELIMITER ;
(记得在 CREATE TRIGGER 语句的末尾使用 //
作为分隔符。)
当 运行 创建触发器的查询时,我目前没有收到错误,但在 运行 它之后我无法执行另一个查询。好像我没有关闭一些封装:
DELIMITER // CREATE TRIGGER trigger_name BEFORE DELETE ON existingtable for each row begin INSERT INTO new_delete_table (column) values(old.column) end; END DELIMITER;
我正在使用命令行并开始于:
mysql>
我执行并收到一个新的:
mysql>
这是查询成功时的正常行为。如果我随后尝试查看我的触发器,我将陷入无限循环,等待我输入一些字符来关闭某些东西。
mysql> show triggers;
->
我可以使用 ctrl + c
退出该功能,但这也会让我退出 MySQL。当我重新登录时,我的触发器不存在,我找不到任何错误。
你的代码有一些错误
每个代码行都必须以分号结尾,而且你有一个 END 到很多
DELIMITER //
CREATE TRIGGER trigger_name BEFORE DELETE ON existingtable
for each row
begin
INSERT INTO new_delete_table (`column`) values
(old.column) ;
end//
DELIMITER;
DELIMITER
命令比较特殊。命令之后直到行尾的所有字符都被解释为要用作新分隔符的字符串。
您不能将代码放在同一行,因为所有这些代码都将成为新分隔符的一部分。这就是为什么没有错误,但没有执行 CREATE TRIGGER 语句的原因。它只是成为一个很长的分隔符字符串的一部分。
DELIMITER
必须将 end-of-line 解释为命令结束的原因是它不接受 ;
作为 DELIMITER
命令的结束.如果是这样,将无法将分隔符重置回 ;
.
您在评论中询问是否需要换行。除了 DELIMITER
命令后的换行符外,您不需要换行符。你可以这样做:
DELIMITER //
CREATE TRIGGER trigger_name BEFORE DELETE ON existingtable FOR EACH ROW BEGIN INSERT INTO new_delete_table (column) VALUES(old.column) END //
DELIMITER ;
(记得在 CREATE TRIGGER 语句的末尾使用 //
作为分隔符。)