【问题标题】:MySQL Trigger with conditional statement and update another tableMySQL 用条件语句触发并更新另一个表
【发布时间】:2014-10-10 12:49:18
【问题描述】:

在 MySQL 5.5 上,我正在尝试编写一个触发器来执行以下操作:

  • 检查插入条件(group_id 是否在 8-20 之间?)
  • 如果条件为真,则在 另一个表 上更新具有相同 user_id 的用户,称为 phpbb_users。
  • 对这个其他表的更新是将 user_rank 设置为 NEW.group_id 从具有触发器的表上的插入。
  • 否则,什么也不做。

完全没有经验,卡住了。我运行查询时它不起作用。这是我到目前为止所得到的。

DELIMITER $$

    CREATE OR REPLACE TRIGGER upd_rank AFTER INSERT ON `phpbb_user_group`
    FOR EACH ROW BEGIN
      IF (NEW.group_id BETWEEN 8 AND 20) THEN
            UPDATE phpbb_users
            SET user_rank=NEW.group_id 
            WHERE user_id=NEW.user_id;
       ELSE 
            UPDATE phpbb_users
            SET user_rank='0'
            WHERE user_id=NEW.user_id;
       END IF;
    END$$;

DELIMITER;

(请注意,“else”子句实际上是不必要的 - 很高兴有任何改进此代码的建议!)

【问题讨论】:

  • 您的问题是什么?这段代码有问题吗?
  • 你可以使用user_rank=IF(NEW.group_id BETWEEN 8 AND 20,NEW.group_id,0)
  • 是的,它没有在数据库上执行。我非常缺乏经验,我无法弄清楚它有什么问题。
  • END$$ 后面的 ; 看起来不正确。

标签: mysql sql triggers delimiter conditional-statements


【解决方案1】:

如果你只想摆脱else试试

CREATE TRIGGER upd_rank AFTER INSERT ON `phpbb_user_group`
FOR EACH ROW 
   UPDATE phpbb_users
   SET user_rank=IF(NEW.group_id BETWEEN 8 AND 20,NEW.group_id,"0")
   WHERE user_id=NEW.user_id;

【讨论】:

  • 谢谢,很棒的提示!这是更好的语法。但是当我在控制台中运行它时它不起作用。我收到错误消息“1064 - 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在 'TRIGGER upd_rank AFTER INSERT ON phpbb_user_group FOR EACH ROW BEGIN UPDA' 行附近使用1" 我不知道出了什么问题...
  • 好的,删除它。我在 Navicat,现在,当我运行它时,我只是得到一个像这样的箭头 ->(没有错误消息!)这是否意味着一切都很好?
  • ->开头的行表示当前语句还没有结束。 MySQL 正在等待 DELIMITER - 你改变了吗?就我而言,不需要更改它。我不知道 NaviCat 所以你必须通过在 phpbb_user_group 中插入一些东西来测试它。
  • 嗨@Hanna,如果这个或任何答案解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 2015-01-10
  • 1970-01-01
  • 2014-10-20
  • 2011-03-23
  • 1970-01-01
  • 2014-02-11
相关资源
最近更新 更多