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