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?