MySQL BEFORE UPDATE 触发器 - 更改值

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14774220/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 16:28:59  来源:igfitidea点击:

MySQL BEFORE UPDATE trigger - change value

mysqlsqltriggers

提问by Flock Dawson

So, I've got a MySQL table, named employees.

所以,我有一个 MySQL 表,名为员工。

ID    name    meta
0     Hyman    ok
1     anne    del

I want to write a trigger which prevents a row where meta='del' to update the meta field. So, if I do:

我想编写一个触发器来防止 meta='del' 更新元字段的行。所以,如果我这样做:

UPDATE employees SET meta = 'busy' WHERE ID = 0

The row should be updated and meta would be 'busy'

该行应该被更新,元将是“忙”

But when I do:

但是当我这样做时:

UPDATE employees SET meta = 'busy' WHERE ID = 1

The meta field should still be 'del'

元字段仍应为“del”

I tried:

我试过:

delimiter $$
CREATE TRIGGER updateEmployees
BEFORE UPDATE ON employees
FOR EACH ROW 
BEGIN
    IF OLD.meta = 'del' THEN
        NEW.meta = 'del'
    END IF;
END$$
delimiter ;

But MySQL returns with an syntax error. Any ideas?

但是 MySQL 返回一个语法错误。有任何想法吗?

回答by hadess20

You forgot to add the SET clause. This way it doesn't actually change the value.

您忘记添加 SET 子句。这样它实际上不会改变值。

delimiter $$
CREATE TRIGGER updateEmployees
BEFORE UPDATE ON employees
FOR EACH ROW 
BEGIN
    IF OLD.meta = 'del' THEN
        SET NEW.meta = 'del';
    END IF;
END$$
delimiter ;

回答by John Woo

you missed ;

delimiter $$
CREATE TRIGGER updateEmployees
BEFORE UPDATE ON employees
FOR EACH ROW 
BEGIN
    IF OLD.meta = 'del' THEN
        NEW.meta = 'del';   -- << here
    END IF;
END$$
delimiter ;

你错过了 ;

delimiter $$
CREATE TRIGGER updateEmployees
BEFORE UPDATE ON employees
FOR EACH ROW 
BEGIN
    IF OLD.meta = 'del' THEN
        NEW.meta = 'del';   -- << here
    END IF;
END$$
delimiter ;

TRIGGER IS EVIL.

触发器是邪恶的

An alternative to trigger is by adding another condition AND

触发的替代方法是添加另一个条件 AND

UPDATE employees 
SET    meta = 'busy' 
WHERE  ID = 1 AND meta <> 'del'