MYSQL更新触发器检查所有列的更改并将值插入到其他表

标签 mysql triggers

我已经看到了这段代码,但是从这里我必须手动插入所有列并按每一列进行检查

CREATE TRIGGER table_a_update BEFORE UPDATE ON table_a
FOR EACH ROW     
BEGIN
   IF (NEW.column1 <=> OLD.column1) 
   THEN
       INSERT INTO table_updates(table, object_id, user_id, column, old_value, new_value)
       VALUES ("table_a",NEW.id, NEW.user_id, "column1", OLD.column1, new.column1)
   END IF;
   IF (NEW.column2 <=> OLD.column2) 
   THEN
       INSERT INTO table_updates(table, object_id, user_id, column, old_value, new_value)
       VALUES ("table_a",NEW.id, NEW.user_id, "column2", OLD.column2, new.column2)
   END IF;
   (other columns... ifs)
END;

我想知道如何从 NEW 中获取与 OLD 列有差异的所有列,然后将其插入,例如使用 php 来插入我不知道的内容:

BEGIN
    for(columns(NEW) as $column){
        IF (NEW.$column <=> OLD.$column)
        THEN
            INSERT INTO table_updates(table, object_id, user_id,column, old_value, new_value)
            VALUES ("table_a", NEW.id, NEW.user_id, $column, $OLD[$column], $NEW[$column])
        END IF;
    }
END;

最佳答案

IIUC:

DELIMITER $$
CREATE TRIGGER before_update_table_a
BEFORE UPDATE ON table_a 
FOR EACH ROW BEGIN

    IF (NEW.col1 <> OLD.col1) THEN
        INSERT INTO table_updates (col1, col2, ... 
        VALUES (OLD.col1, NEW.col2 ...
    END IF;

    IF (NEW.col2 <> OLD.col2) THEN
        INSERT INTO table_updates (col1, col2, ... 
        VALUES (NEW.col1, OLD.col2 ...
    END IF;

    ... 

END $$
DELIMITER ;

我相信您需要在此触发器中使用DELIMITER关键字,如果您想了解更多相关信息,请查看this问题。

关于MYSQL更新触发器检查所有列的更改并将值插入到其他表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55329692/

相关文章:

sql-server-2008 - SQL Server 2008 在插入前触发

PHP 按钮删除 MYSQL 表输出中的一行

mysql - SQL 匹配/反对词序

mysql - 在 laravel 5.4 中更新查询

mysql - SQL计算所有行数

PHP 比较两个日期时间范围

mysql - 如何使用 mysql 触发器划分到另一列?

MySQL触发器将第一个表的数据插入后插入第二个表

如果插入的值与唯一约束冲突,则 SQL 触发器在插入时更新字段

sql - PostgreSQL 错误 : payload string too long