【问题标题】:What is wrong with this trigger syntax?这个触发器语法有什么问题?
【发布时间】:2011-08-16 13:10:03
【问题描述】:

看这段代码:

分隔符 $$ 如果存在 `after_product_insert` 则删除触发器 $$ 创建触发器`after_product_insert` 在“产品”上插入后 每一行 更新`categories` SET product_count=product_count+1 where id = NEW.category_id; 结束$$

这运行正常,但显示一些错误。这是输出:

查询正常,0 行受影响(0.16 秒) ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“END”附近使用正确的语法

因此,即使创建了触发器 - 脚本(包含此触发器)也会因为错误而死掉。这可能真的很简单,但不知何故我错过了重点。帮助任何人?

【问题讨论】:

  • 您可以尝试将:where id= 更改为 where categories.id= 吗?我猜两个表中都存在id 字段。
  • 您还有一个END,但没有BEGIN。您可以删除END 或添加BEGIN
  • 'id' 不会产生问题,因为 id 用于 'update categories' 语句的上下文中。不过感谢END-BEGIN。对我来说是一个可怕的错误。浪费时间。

标签: mysql


【解决方案1】:

这是一个两表触发器,所以id 可能是模棱两可的。将表名添加到其中。将表名添加到每个字段引用中不会有什么坏处。

没关系。在UPDATE 之前没有BEGINFOR 语句似乎期望在语句周围执行 BEGINEND

DELIMITER $$
DROP TRIGGER IF EXISTS `after_product_insert` $$
CREATE TRIGGER `after_product_insert`
AFTER INSERT ON `products`
  FOR EACH ROW
  BEGIN
    UPDATE `categories`
      SET product_count=product_count+1
      WHERE id = NEW.category_id;
  END$$

【讨论】:

  • 谢谢。我完全错过了。我想知道为什么 mysql 工作台生成的语句没有“开始”。
  • @Vikash:如果只有一个语句,则不需要 BEGIN-END。
猜你喜欢
  • 2012-04-26
  • 2017-12-24
  • 2013-12-06
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多