mysql中的触发器出现错误

Posted

技术标签:

【中文标题】mysql中的触发器出现错误【英文标题】:triggers in mysql getting an error 【发布时间】:2017-12-19 16:46:11 【问题描述】:

我正在尝试创建一个将更新某些值的触发器,如果​​该行不存在,则插入一个 value = 1 的新行。

我用 3 种可能的方式编写了触发器,但它们都出错了

版本 1:

CREATE TRIGGER stat_trg BEFORE INSERT ON comments
  FOR EACH ROW
  BEGIN
    INSERT INTO statistics 
      SET item_id = NEW.item_id,
          likes = 0,
          comment = 1
    ON DUPLICATE KEY UPDATE  
      SET comment = OLD.comment + 1;
  END; 

您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册以获取正确的语法使用 在第 9 行的“SET comment = OLD.comment + 1”附近

版本 2:

CREATE TRIGGER stat_trg AFTER INSERT ON comments
FOR EACH ROW
BEGIN
    DECLARE num integer DEFAULT 0;
    SELECT comment into num FROM statistics
      WHERE item_id = OLD.item_id;
    SET num := num + 1; 

    INSERT INTO statistics (item_id, comment, likes) VALUES (num,1,0)
END;

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 第 4 行的 '' 附近

版本 3:

CREATE TRIGGER stat_trg BEFORE INSERT ON comments
  FOR EACH ROW
  BEGIN
    INSERT INTO statistics (item_id, likes, COMMENT) VALUES (NEW.item_id,0,1)
    ON DUPLICATE KEY UPDATE  
      comment = comment + 1;
  END; 

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 6 行的 '' 附近使用

根据我找到的示例,一切看起来都不错,我缺少什么? 请帮助解决这个问题。 谢谢。

【问题讨论】:

请查看INSERT ... ON DUPLICATE KEY UPDATE Syntax。您正试图在 SQL 语句中注入任意过程代码。 也试过了,同样的错误。 可以分享statistics 的餐桌设计吗? 我将评论栏更改为 --> cmets(没有区别,只是听起来更好)。反正... item_id Index mediumint(9) like int(11) cmets int(11) 【参考方案1】:

请试试这个:

DELIMITER $$
CREATE TRIGGER `stat_trg` BEFORE INSERT ON `comments`
  FOR EACH ROW BEGIN
    INSERT INTO `statistics` set item_id= NEW.item_id, likes = '0', comments = '1' ON DUPLICATE KEY UPDATE 
      comments = values(comments) + 1;
  END$$
  DELIMITER ;

【讨论】:

以上是关于mysql中的触发器出现错误的主要内容,如果未能解决你的问题,请参考以下文章

触发器中的 MySQL 错误“'NEW' 中的未知列”

MySQL中的触发器语句错误

mysql触发器中的语法错误

phpmyAdmin 中的 MySQL 触发器错误

引发错误,防止 MySQL 触发器中的表更新

MySQL:在自己的触发器中更新表