我刚搬到phymysql,我在创建触发器方面遇到了问题。以下是我的剧本
CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile
FOR EACH ROW
BEGIN
DECLARE var1 INT;
DECLARE var2 INT;
DECLARE var3 CHAR(100);
DECLARE var4 CHAR(100);
DECLARE var5 CHAR(3);
SELECT profile_id,
profile_id,
fname,
fname,
fpage
FROM profile
INTO var1,
var2,
var3,
var4,
var5;
IF var5 = 'yes'
THEN
INSERT INTO fiends
(req_id, resp_id, req_name, resp_name, fpage)
VALUES
(var1, var2, var3, var4, 'yes');
END IF;
END
当我执行时,我收到此错误
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5
任何帮助都将是我的赞赏。
答案 0 :(得分:0)
在MySQL中执行此操作的典型方法是使用:=
:
SELECT var1 := profile_id,
var2 := profile_id,
var3 := fname,
var4 := fname,
var5 := fpage
FROM profile;
在我看来,into
条款与Oracle类似。
那说,有两点需要注意:
profile
只有一行。通常会有where
条款。v_
)命名变量,以免与列混淆。但是,我会在没有变量的情况下写这个:
DELIMITER $$
CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile
FOR EACH ROW
BEGIN
INSERT INTO fiends(req_id, resp_id, req_name, resp_name, fpage)
SELECT profile_id, profile_id, fname, fname
FROM profile p
WHERE fpage = 'yes';
END$$
DELIMITER ;
这似乎更简单。我猜测yes
应该是一个字符串。
编辑:
如果您想要插入的行,请使用new
:
DELIMITER $$
CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile
FOR EACH ROW
BEGIN
INSERT INTO fiends(req_id, resp_id, req_name, resp_name, fpage)
SELECT new.profile_id, new.profile_id, new.fname, new.fname
FROM dual
WHERE new.fpage = 'yes';
END$$
DELIMITER ;
答案 1 :(得分:0)
我怀疑问题在于语句分隔符;我怀疑它仍然设置为分号字符。
因为触发器包含分号字符,要使“create trigger”语句作为一个单元运行,您需要将分隔符更改为在“create trigger”语句中不出现的字符串
例如:
-- change the statement delimiter to something other than semicolon
DELIMITER $$
-- execute the "create trigger" statement containing semicolons
CREATE TRIGGER ...
BEGIN
... ;
... ;
IF ( ... ) THEN
... ;
END IF;
... ;
END$$
-- the occurrence of the $$ delimiter on the line above ends the statement
-- change the delimiter back to semicolon
DELIMITER ;
另外,我认为不允许触发器从刚刚插入的同一个表中进行选择。 (我知道在Oracle中限制FOR EACH ROW触发器;我必须查阅MySQL参考手册以确定...有一节关于“对mysql存储程序的限制”,程序是最自由的,函数有与程序相同的限制,加上更多和触发器具有与功能相同的限制,以及更多。
此外,当执行该触发器时(如果允许从同一个表中进行选择),该SELECT语句可能会返回多行。使用INTO
形式,我们预计最多会返回一行。
如果目的是引用刚刚插入的行的值,并将其插入到另一个表fiends
(或friends
?)中的插入中
使用 NEW.column_name
表单来引用值
例如:
DELIMITER $$
CREATE TRIGGER profile_ai
AFTER INSERT ON profile
FOR EACH ROW
BEGIN
IF ( NEW.fpage = 'yes' ) THEN
-- are some of your friends fiends ?
INSERT INTO fiends
( req_id
, resp_id
, req_name
, resp_name
, fpage
) VALUES
( NEW.profile_id
, NEW.profile_id
, NEW.fname
, NEW.fname
, 'yes'
);
END IF;
END$$
DELIMITER ;