MySQL BEFORE UPDATE触发器 - 更改值

Flo*_*son 9 mysql sql triggers

所以,我有一个名为employees的MySQL表.

ID    name    meta
0     jack    ok
1     anne    del
Run Code Online (Sandbox Code Playgroud)

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

UPDATE employees SET meta = 'busy' WHERE ID = 0
Run Code Online (Sandbox Code Playgroud)

该行应该更新,元将"忙"

但当我这样做时:

UPDATE employees SET meta = 'busy' WHERE ID = 1
Run Code Online (Sandbox Code Playgroud)

元字段应该仍然是'del'

我试过了:

delimiter $$
CREATE TRIGGER updateEmployees
BEFORE UPDATE ON employees
FOR EACH ROW 
BEGIN
    IF OLD.meta = 'del' THEN
        NEW.meta = 'del'
    END IF;
END$$
delimiter ;
Run Code Online (Sandbox Code Playgroud)

但MySQL返回时出现语法错误.有任何想法吗?

小智 17

你忘了添加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 ;
Run Code Online (Sandbox Code Playgroud)


Joh*_*Woo 0

你错过了;

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 ;
Run Code Online (Sandbox Code Playgroud)

触发是邪恶的

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

UPDATE employees 
SET    meta = 'busy' 
WHERE  ID = 1 AND meta <> 'del'
Run Code Online (Sandbox Code Playgroud)

  • 为什么TRIGGER是邪恶的?它是一个非常强大的工具,数据库管理员可以使用它来强制执行数据完整性规则。在数据完整性至关重要的环境中(例如公司记录),触发器提供了执行此操作的宝贵资源,甚至对应用程序开发人员也是如此。我现在甚至在我的个人开发中也使用触发器,因为它们以很小的性能开销为我强制执行数据完整性,无论如何,应用程序执行相同的检查都会丢失这些数据...... (28认同)