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

Posted

技术标签:

【中文标题】CREATE TRIGGER 之前 DELIMITER 上的 MySQL 语法错误【英文标题】:MySQL Syntax Error on DELIMITER before CREATE TRIGGER 【发布时间】:2013-11-15 08:25:44 【问题描述】:

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

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

我正在用php提交SQL,如下所示,错误信息是:

无效查询:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“DELIMITER $$ CREATE TRIGGER FP_PAGO_AI AFTER INSERT ON 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 ;
";

【问题讨论】:

你用来发送这个到 MySQL 的方法一次只能执行 1 条语句。 DELIMITER $$ 是一个声明。 你的意思是 PHP mysql_query 函数?好吧,无论如何,我尝试直接在 phpMyAdmin 中提交查询,但它返回了其他错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 26 行的“END”附近使用正确的语法 我编辑了标题以修正拼写错误,但 SO 要求我改写标题,因为该标题已经是另一个问题了。 【参考方案1】:

你根本不需要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 ;

【讨论】:

确实如此。它有一个额外的 END。

以上是关于CREATE TRIGGER 之前 DELIMITER 上的 MySQL 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Mobile:更新导航栏时替代 .trigger('create') 或 .page()?

Create After Trigger 有效,但 Create Before 无效

Learn How To Create Trigger In Oracle Forms

CREATE TRIGGER时NEW和OLD是关键字

PostgreSQL 9.4.2 中的“CREATE TRIGGER”使用啥锁(如果有)

SQLite CREATE TRIGGER ... SQLite 错误 1 ​​与语句:不完整的输入