我使用以下语法在MySQL中创建了一个存储过程。

DROP PROCEDURE IF EXISTS `sp-set_comment_count`;

DELIMITER $$

CREATE PROCEDURE `sp_set-comment_count` (IN _id INT)
BEGIN
   -- AC   - AllCount
   DECLARE AC INT DEFAULT 0;

   SELECT COUNT(*) AS ac
     INTO AC
     FROM usergroups AS ug
LEFT JOIN usergroup_comments AS ugm ON ugm.`gid` = ug.`id`
LEFT JOIN mediagallery AS dm ON ugm.mid = dm.`id`
    WHERE dm.`status` NOT IN (200, 201, 202, 203, 204, 205)
      AND ug.`id` = _id;

   UPDATE usergroups
      SET allCount = AC,
    WHERE usergroups.`id` = _id;

END $$
DELIMITER ;

仅供参考,我已经大大简化了存储过程,但我确实知道它可以无问题。

我想做的是从usergroup_comments中设置一个触发器。

DROP TRIGGER IF EXISTS `usergroups_comments_insert` 

CREATE TRIGGER `usergroups_comments_insert` AFTER INSERT ON `usergroups_comment`
    FOR EACH ROW
    BEGIN
       CALL sp-set-comment_count(NEW.`gid`);
    END;

但是,由于某种原因,每次我进行MySQL都会给我带来错误,这无用,说明第4行上存在语法错误。

我已经梳理了MySQL文档,并找到了一些有关触发器限制的信息,但发现它是相当复杂的。

http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html

任何想法都会有所帮助。

有帮助吗?

解决方案 2

因此,事实证明,这是困扰我几个小时的问题。

我可以轻松地定义一个称为sp_set-comment_count的过程。但是,当调用该程序时,它的工作方式不同样。

调用sp_set -comment_count(我只能假设这是因为服务器将其解释为负)。

此后,我将存储的过程名称更改为仅使用下划线,并且似乎已经解决了所有问题。

其他提示

有充分的理由使您切勿在触发器内调用存储程序。

触发器本质上是存储程序。他们的行动几乎很难回滚. 。即使所有基础表都是InnoDB,您也会经历成比例的共享行锁和独家行锁的烦人间歇性。如果触发器正在操纵桌子,那将是这种情况 插入和更新被停滞以执行重型 MVCC 在每个触发器的呼叫中.

不要忘记触发器需要开销。实际上,根据 MySQL存储过程编程, ,第256页“扳机开销”下方说:

重要的是要记住,必要时,触发器将开销添加到其应用的DML语句中。开销的实际量将取决于触发器的性质,但是---所有MySQL触发器为每行执行 - - 开销可以迅速积累来处理大量行的语句。因此,您应该避免将任何昂贵的SQL语句或程序代码放在触发器中。

第529-531页上给出了触发开销的扩展解释。该节的总结指出以下内容:

这里的教训是:由于触发代码将对受DML语句影响的每一行执行一次,因此触发器可以轻松成为DML性能中最重要的因素。触发器主体内部的代码必须尽可能轻巧,尤其是 - 尤其是触发器中的任何SQL语句,应尽可能由索引支持。

我在较早的帖子中解释了触发器的其他令人讨厌的方面。

概括

我会 强烈建议不要从触发器调用任何存储程序, ,即使MySQL允许。 您应该Wlays查看MySQL 5.5的当前限制.

如果说语法错误,则最有可能忘记更改定界符(如存储过程所做的那样)。所以你需要

DELIMITER $$
CREATE TRIGGER `usergroups_comments_insert` AFTER INSERT ON `usergroups_comment`
FOR EACH ROW
BEGIN
   CALL sp_set_count(NEW.`gid`);
END;
$$

看起来像逗号之后 AC 是语法错误:

UPDATE usergroups
   SET allCount = AC,
 WHERE ........
许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top