Mysql 触发器创建失败,错误 #1064

Posted

技术标签:

【中文标题】Mysql 触发器创建失败,错误 #1064【英文标题】:Mysql trigger creation fails with error #1064 【发布时间】:2021-11-25 11:17:44 【问题描述】:

我正在尝试通过 phpMyAdmin 在表 ORDERS 上创建触发器 After_Insert:

DECLARE v1 VARCHAR DEFAULT NULL;
DECLARE v2 VARCHAR DEFAULT '0';
IF NEW.PFIELD =0 
THEN 
(
SELECT a.NAME,a.CONTACT INTO v1,v2 FROM ADDRESSBOOK a WHERE a.ID=NEW.ID_SENDER LIMIT 1;
REPLACE INTO _SENDERS (AID,OID,OTP,NAME,CONTACT) VALUES (NEW.ID_SENDER,NEW.ID,NEW.OTYPE,v1,v2);
)
ELSE 
(
SELECT ap.NAME,ap.CONTACT INTO v1,v2 FROM ADDRESSBOOK_P ap WHERE ap.ID=NEW.PFIELD LIMIT 1;
REPLACE INTO _SENDERS_P (AID,OID,OTP,NAME,CONTACT) VALUES (NEW.PFIELD,NEW.ID,NEW.OTYPE,v1,v2);
)
END IF;

但我得到了默认的 mysql 错误:

MySQL said: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DECLARE v1 VARCHAR DEFAULT NULL; DECLARE v2 VARCHAR DEFAULT NULL; IF NEW....' at line 1

我做错了什么? 我是一个经验丰富的 mySQL/php 用户,但对触发器并不是真正的朋友,现在我决定将我的硬编码 php 代码重写为触发器(可以在其中完成)

感谢您的建议

【问题讨论】:

提供 COMPLETE 触发文本 - 从 CREATE TRIGGER 到最后的 END。为每个提到的表添加完整的 CREATE TABLE。 您不能在触发器的输出流中使用 SELECT。您只能在 BEGIN-END 块的开头声明局部变量。 @Akina - 我从浏览器的 phpMyAdmin 执行此操作,我只能修改正文并从 phpMyAdmin 的列表框中选择之前/之后 + 插入/更新/删除,所以我原来的文本post是我写的整个脚本 【参考方案1】:

我解决了这个问题,老实说不知道问题到底出在哪里,但是当我将WHOLE DROP IF EXISTS / CREATE 脚本写入新的 SQL 脚本时,他的 MySQL 服务器接受了该触发器并且它正常工作。

奇怪.. 感谢@Akina 的间接建议

现在,我的脚本如下所示:

DELIMITER //

CREATE TRIGGER _AI_ORDERS_
AFTER INSERT
   ON ORDERS FOR EACH ROW

BEGIN

DECLARE v1 VARCHAR DEFAULT NULL;
DECLARE v2 VARCHAR DEFAULT '0';
IF NEW.PFIELD =0 
THEN 
(
SELECT a.NAME,a.CONTACT INTO v1,v2 FROM ADDRESSBOOK a WHERE a.ID=NEW.ID_SENDER LIMIT 1;
REPLACE INTO _SENDERS (AID,OID,OTP,NAME,CONTACT) VALUES (NEW.ID_SENDER,NEW.ID,NEW.OTYPE,v1,v2);
)
ELSE 
(
SELECT ap.NAME,ap.CONTACT INTO v1,v2 FROM ADDRESSBOOK_P ap WHERE ap.ID=NEW.PFIELD LIMIT 1;
REPLACE INTO _SENDERS_P (AID,OID,OTP,NAME,CONTACT) VALUES (NEW.PFIELD,NEW.ID,NEW.OTYPE,v1,v2);
)
END IF;

END; //

DELIMITER ;

【讨论】:

您不需要在中间 SELECT 和两个变量中。只需使用 REPLACE .. SELECT. @Akina 谢谢,我知道,但是有些触发器更“狂野”,并且有 20 多个变量,这可能会在我的脚本中造成混乱,以备将来获得更好的可读代码,但是它可能会花费很少的额外服务器资源。

以上是关于Mysql 触发器创建失败,错误 #1064的主要内容,如果未能解决你的问题,请参考以下文章

更新触发器后创建空字符串时出现无法解释的 MySQL 错误 #1064?

创建触发器时出现错误 1064

空字符串无法解释的MySQL错误#1064创建更新触发器后?

在 mysql 中创建触发器时出现错误“1064”?

MySql 触发语法错误 1064 空单引号

MySQL 触发语法错误