Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql-更新前的触发器检查值_Mysql_Mysql Error 1064 - Fatal编程技术网

mysql-更新前的触发器检查值

mysql-更新前的触发器检查值,mysql,mysql-error-1064,Mysql,Mysql Error 1064,我试图触发一个触发器,检查更新后员工的工资是否低于其经理的工资,如果低于,则中止更新 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


我试图触发一个触发器,检查更新后员工的工资是否低于其经理的工资,如果低于,则中止更新

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)

  • 您需要将分隔符重新定义为其他内容(例如:
    $
    ),而不是(
  • 此外,作为一项安全措施,检查同名触发器是否已存在(
    如果存在,则丢弃触发器
  • 最后,将
    分隔符重新定义为
将触发器更改为如下所示:

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 ;

不起作用,现在它在第1行的“DELIMITER”附近出现以下错误“error 1604(42000)”@Oppac在
END
$$
打字之间需要一个空格-我正在修复它。请稍后检查更新的答案。我尝试了更新的答案,但仍然有相同的错误。我也不知道它是否相关,但触发器是我的sql文件中唯一的东西。@Oppac如果条件需要一些返工,也许可以。我怀疑
if EXISTS
是否可以这样使用。你能给我两个表的
create table
语句吗。只要相关领域就足够了。我会在我的本地电脑上试用,然后带着补丁回来。@Oppac我刚刚在我的本地电脑上复制了你的表格。我可以成功地创建触发器。你确定你在复制整个事件并创建触发器吗?
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 ;