我正在尝试将使用Firebird制作的触发器重写为MySql触发器。
我真的不知道会是什么。如果有人能帮助我......谢谢
我正在使用PHP提交SQL,如下所示,错误消息为:
查询无效:您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以便在第1行的'每个R'上插入FORMA_PGTO后'DELIMITER $$ CREATE TRIGGER FP_PAGO_AI'附近使用正确的语法
触发器的代码是:
$str[] = "
DELIMITER $$
CREATE TRIGGER FP_PAGO_AU AFTER UPDATE ON FORMA_PGTO
FOR EACH ROW
BEGIN
declare rec_count integer;
declare pg_count integer;
declare cp_pago integer;
select count(*) from forma_pgto fp where fp.id_cpagar=new.id_cpagar into rec_count;
select count(pago) from forma_pgto f where f.id_cpagar=new.id_cpagar and f.pago=1 into pg_count;
/* Se todas parcelas estao pagas, entao setar conta paga */
if (rec_count = pg_count) then
update cpagar c set c.pago=1 where c.id=new.id_cpagar;
/* Senao */
else
/* Se CPAGAR.PAGO = 1, recebe 0 */
select cpg.pago from cpagar cpg where cpg.id=new.id_cpagar into cp_pago;
if (cp_pago = 1) then /* Se cp_pago = 1 */
update cpagar set pago=0 where id=new.id_cpagar;
end if;
end if;
END
END $$
DELIMITER ;
";
答案 0 :(得分:12)
您根本不需要DELIMITER $$
。那是mysql client builtin command。 SQL解析器无法识别客户端内置函数。
您可以将CREATE TRIGGER
语句作为单个语句执行,然后您不需要在语句末尾添加分隔符。分隔符仅在支持多个语句的接口中很重要(例如,mysql客户端)。
phpMyAdmin也允许多个语句,因此您需要设置分隔符,但这是通过用户界面控件而不是DELIMITER
命令完成的。见Store procedures in phpMyAdmin
答案 1 :(得分:2)
直接在PhpmyAdmin中执行它并删除一个冗余的END
DELIMITER $$
CREATE TRIGGER FP_PAGO_AU AFTER UPDATE ON FORMA_PGTO
FOR EACH ROW
BEGIN
declare rec_count integer;
declare pg_count integer;
declare cp_pago integer;
select count(*) from forma_pgto fp where fp.id_cpagar=new.id_cpagar into rec_count;
select count(pago) from forma_pgto f where f.id_cpagar=new.id_cpagar and f.pago=1 into pg_count;
/* Se todas parcelas estao pagas, entao setar conta paga */
if (rec_count = pg_count) then
update cpagar c set c.pago=1 where c.id=new.id_cpagar;
/* Senao */
else
/* Se CPAGAR.PAGO = 1, recebe 0 */
select cpg.pago from cpagar cpg where cpg.id=new.id_cpagar into cp_pago;
if (cp_pago = 1) then /* Se cp_pago = 1 */
update cpagar set pago=0 where id=new.id_cpagar;
end if;
end if;
END $$
DELIMITER ;