首页 文章

在CREATE TRIGGER之前,DELIMITER上的MySQL语法错误

提问于
浏览
1

我正在尝试将使用Firebird制作的触发器重写为MySql触发器 .

我真的不知道会是什么 . 如果有人能帮助我......谢谢

我正在使用PHP提交SQL,如下所示,错误消息是:

查询无效:SQL语法中有错误;检查与您的MySQL服务器版本对应的手册,以便在第1行使用'DELIMITER $$ CREATE TRIGGER FP_PAGO_AI'后插入FORMA_PGTO FOR EACH R'附近使用正确的语法

触发器的代码是:

$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 ;
";

2 回答

  • 12

    你根本不需要 DELIMITER $$ . 那是mysql client builtin command . SQL解析器无法识别客户端内置函数 .

    您只需将 CREATE TRIGGER 语句作为单个语句执行,然后您就不需要在语句的末尾添加分隔符 . 分隔符仅在支持多个语句的接口(例如mysql客户端)中很重要 .

    phpMyAdmin还允许多个语句,因此您需要设置分隔符,但这是通过用户界面控件完成的,而不是 DELIMITER 命令 . 见Store procedures in phpMyAdmin

  • 2

    直接在PhpAdmin中执行它并删除一个冗余的 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 ;
    

相关问题