mysql for-loop-in触发器

cdmah0mi  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(272)

我有两张table:
员工,包括id、姓名、职务
员工审核包括列id、员工id、姓名、职务、更新日期、操作
我有一个扳机现在还可以用…:

CREATE TRIGGER after_update_employees

AFTER UPDATE ON employees FOR EACH ROW

BEGIN

    IF OLD.name <> new.name THEN
        INSERT INTO employees_audit(employee_id, name,change_date,action)
        VALUES(OLD.id, concat('Old:', OLD.first_name, 'New:', new.first_name,'"'),NOW(),"update");
    END IF;

    IF OLD.job_title <> new.job_title THEN
        INSERT INTO employees_audit(employee_id, job_title, change_date,action)
        VALUES(OLD.id, concat('Old:', OLD.job_title, 'New:', new.job_title,'"'),NOW(),"update");
    END IF;

END$$

.. 但是,如果我在employees表中为同一id更新了2个条件,我的触发器将创建2个单独的行(每个条件一行),但我更希望触发器只在一行上声明同一id的所有更新。
例如:

UPDATE employees
SET job_title = "programmer", first_name = "Vic"
WHERE employee_number =1;

触发器1的结果
有没有可能把我的触发器重写成一个循环?

2admgd59

2admgd591#

考虑使用 case 表达式:

IF OLD.name <> NEW.name OR OLD.job_title <> NEW.job_title THEN
    INSERT INTO employees_audit (employee_id, name, job_title, change_date,action)
    VALUES(
        OLD.id, 
        CASE WHEN OLD.name <> NEW.name THEN 
            CONCAT('Old:', OLD.name, 'New:', NEW.name, '''')
        END,
        CASE WHEN OLD.job_title <> new.job_title THEN 
            CONCAT('Old:', OLD.job_title, 'New:', NEW.job_title, '''')
        END,
        NOW(), 
        'update'
END IF;

请注意,我修改了插入其值的列 name (你正在查看 name 但是插入 fist_name ,这没有多大意义)。另外,我用单引号替换了双引号(对字符串使用双引号不是一个好的做法,尽管mysql支持它,因为它偏离了sql标准)。
如果列可为空,则需要附加逻辑:

IF NOT OLD.name <=> NEW.name OR NOT OLD.job_title <=> NEW.job_title THEN
    INSERT INTO employees_audit (employee_id, name, job_title, change_date,action)
    VALUES(
        OLD.id, 
        CASE WHEN OLD.name <> NEW.name THEN 
            CONCAT('Old:', COALESCE(OLD.name, ''), 'New:', COALESCE(NEW.name, ''), '''')
        END,
        CASE WHEN OLD.job_title <> new.job_title THEN 
            CONCAT('Old:', COALESCE(OLD.job_title, ''), 'New:', COALESCE(NEW.job_title, ''), '''')
        END,
        NOW(), 
        'update'
END IF;

相关问题