【问题标题】:MySQL trigger end if syntax error如果语法错误,MySQL 触发结束
【发布时间】:2019-01-13 04:49:21
【问题描述】:

无法在更新特定字段时创建触发器

delimiter //
CREATE TRIGGER `add_event` AFTER  UPDATE ON `order_table` 
  FOR EACH ROW 
  IF NEW.status <=> OLD.status THEN
    INSERT INTO `events` SET 
      events.status = NEW.status, 
      events.order_id = NEW.order_id, 
      events.time_stamp = CURRENT_TIMESTAMP
  END IF;
delimiter ;

我收到了这个错误

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法使用 靠近'END IF;

【问题讨论】:

  • 你不应该在UPDATE之后有, INSERT
  • 没有和 AFTER UPDATE, INSERT 触发器之类的东西 - 你需要一个。
  • 现在我认为您需要在CURRENT_TIMESTAMP 之后使用; 才能正确终止您的声明。
  • FOR EACH ROW 之后你需要一个begin关键字并且在end if;你之后你需要一个end;//
  • SET 语句在 AFTER 触发器中无效,因为行更改已经发生

标签: mysql sql


【解决方案1】:

下面的mysql触发器没有语法错误。

delimiter //
 CREATE TRIGGER add_event AFTER UPDATE ON order_table
    FOR EACH ROW
    BEGIN
         IF NEW.status <=> OLD.status THEN
            INSERT INTO `events` 
            SET events.status = NEW.status, 
            events.order_id = NEW.order_id, 
            events.time_stamp = CURRENT_TIMESTAMP;
         END IF;
     END;//
 delimiter ;

【讨论】:

  • 有效!!谢谢你:)
  • @deadman Ananth 无法投票,没有足够的代表点数。不过我做到了。
【解决方案2】:
drop table if exists t;
drop table if exists events;

create table t(order_id int, status varchar(1));
create table events(order_id int, time_stamp timestamp,status varchar(1));
drop trigger if exists t;
delimiter //
CREATE TRIGGER t after update ON `t` 
 FOR EACH ROW 
 begin
 IF NEW.status <> OLD.status THEN
    INSERT INTO `events` 
        SET events.status = NEW.status, 
                events.order_id = NEW.order_id, 
                 events.time_stamp = CURRENT_TIMESTAMP;
END IF ;
end //
 delimiter ;

 insert into t values(1,1);
 insert into events values(1,now(),1);
 update t set status = 2 where order_id = 1;
 select * from t;
 select * from events;

MariaDB [sandbox]>  select * from t;
+----------+--------+
| order_id | status |
+----------+--------+
|        1 | 2      |
+----------+--------+
1 row in set (0.00 sec)

MariaDB [sandbox]>  select * from events;
+----------+---------------------+--------+
| order_id | time_stamp          | status |
+----------+---------------------+--------+
|        1 | 2018-08-06 10:16:35 | 1      |
|        1 | 2018-08-06 10:16:35 | 2      |
+----------+---------------------+--------+
2 rows in set (0.00 sec)

【讨论】:

    【解决方案3】:

    为什么要使用 if 语句。您正在检查所有内容。这是解决方案:

    CREATE TRIGGER `add_event` AFTER  UPDATE ON `order_table` 
     FOR EACH ROW 
     BEGIN
     INSERT INTO `events` SET events.status = NEW.status, events.order_id = NEW.order_id, events.time_stamp = CURRENT_TIMESTAMP;
    END;
     delimiter ;
    

    【讨论】:

    • 即使我需要检查特定字段是否更新,如果更新则插入
    • 您使用的是哪个版本?
    • 您正在检查所有内容。此 IF 语句始终返回 true。
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 2014-07-21
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2015-06-02
    相关资源
    最近更新 更多