mysql - 触发更新前校验值

mysql - Trigger check value before update


我正在尝试制作一个触发器,检查更新后员工的薪水是否低于其经理的薪水,如果是,则中止更新。

CREATE TRIGGER Employee_BeforeUpdate
 BEFORE UPDATE ON Employee
  FOR EACH ROW
  BEGIN
   IF EXISTS (
     SELECT * FROM Manager, Manages
     WHERE NEW.eid = Manages.eid
     AND Manager.mid = Manages.mid
     AND NEW.salary > Manager.salary)
   THEN SIGNAL SQLSTATE '45000' SET message_text = 'Error message';
   END IF;
 END;

我在第 9 行的“”附近遇到语法错误 (1064),我不知道为什么。这也是触发的正确方法吗?

(MySql 版本 5.7.23-0ubuntu.18.04.1)

CREATE TABLE Employee (eid char(5), salary integer, primary key(eid));
CREATE TABLE Manager (mid char(5), salary integer, primary key(mid));
CREATE TABLE Manages (mid char(5), eid char(5) , primary key (mid,eid),
                      foreign key(mid) references Manager(mid),
                      foreign key(eid) references Employee(eid));
  • 您需要将 Delimiter 重新定义为其他内容(例如:$$),而不是 (;).
  • 同时作为一项安全措施,检查是否已经存在同名触发器(DROP TRIGGER IF EXISTS)
  • 最后,将DELIMITER重新定义为;

将触发器更改为如下:

DELIMITER $$
DROP TRIGGER IF EXISTS Employee_BeforeUpdate $$
CREATE TRIGGER Employee_BeforeUpdate
 BEFORE UPDATE ON Employee
  FOR EACH ROW
  BEGIN
   IF EXISTS (
     SELECT * FROM Manager, Manages
     WHERE NEW.eid = Manages.eid
     AND Manager.mid = Manages.mid
     AND NEW.salary > Manager.salary)
   THEN SIGNAL SQLSTATE '45000' SET message_text = 'Error message';
   END IF;
 END $$
DELIMITER ;