MySQL触发器获取当前修改数据

MySQL触发器是一种在数据库表上定义的特殊类型的存储过程,它在特定的事件发生时被触发执行。利用触发器,我们可以在数据库表的插入、更新或删除操作发生时执行一些额外的逻辑。本文将重点介绍如何在MySQL触发器中获取当前修改的数据,并提供相应的代码示例。

触发器简介

触发器是通过定义在数据库表上的针对特定事件(如插入、更新、删除)的存储过程。它们是自动执行的,并且可以用于实现数据库的约束条件、数据校验、数据同步等操作。MySQL支持BEFORE和AFTER两种类型的触发器,它们分别指定了触发时间。

获取当前修改的数据

当触发器被执行时,我们有时候需要获取当前正在修改的数据,以便进行一些额外的操作。在MySQL中,可以使用OLD和NEW关键字来获取修改前后的数据。

  • OLD关键字:用于获取旧数据,只能在UPDATE和DELETE触发器中使用。
  • NEW关键字:用于获取新数据,只能在INSERT和UPDATE触发器中使用。

下面是一个示例表users的结构:

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100)
);

接下来,我们将演示如何在触发器中获取当前修改的数据。

获取插入的数据

在INSERT触发器中,可以使用NEW关键字来获取插入的数据。

DELIMITER //

CREATE TRIGGER after_insert_users
AFTER INSERT ON users
FOR EACH ROW
BEGIN
  -- 获取插入的数据
  DECLARE name VARCHAR(100);
  DECLARE email VARCHAR(100);
  
  SET name = NEW.name;
  SET email = NEW.email;
  
  -- 在控制台输出插入的数据
  SELECT CONCAT('Inserted: ', name, ' ', email) AS message;
END //

DELIMITER ;

获取更新的数据

在UPDATE触发器中,可以使用OLD和NEW关键字来获取更新前后的数据。

DELIMITER //

CREATE TRIGGER after_update_users
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
  -- 获取更新前后的数据
  DECLARE oldName VARCHAR(100);
  DECLARE newName VARCHAR(100);
  
  SET oldName = OLD.name;
  SET newName = NEW.name;
  
  -- 在控制台输出更新前后的数据
  SELECT CONCAT('Updated: ', oldName, ' => ', newName) AS message;
END //

DELIMITER ;

获取删除的数据

在DELETE触发器中,可以使用OLD关键字来获取删除的数据。

DELIMITER //

CREATE TRIGGER after_delete_users
AFTER DELETE ON users
FOR EACH ROW
BEGIN
  -- 获取删除的数据
  DECLARE name VARCHAR(100);
  
  SET name = OLD.name;
  
  -- 在控制台输出删除的数据
  SELECT CONCAT('Deleted: ', name) AS message;
END //

DELIMITER ;

触发器示例

下面是一个完整的示例,展示了如何使用触发器获取当前修改的数据。

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100)
);

DELIMITER //

CREATE TRIGGER after_insert_users
AFTER INSERT ON users
FOR EACH ROW
BEGIN
  -- 获取插入的数据
  DECLARE name VARCHAR(100);
  DECLARE email VARCHAR(100);
  
  SET name = NEW.name;
  SET email = NEW.email;
  
  -- 在控制台输出插入的数据
  SELECT CONCAT('Inserted: ', name, ' ', email) AS message;
END //

CREATE TRIGGER after_update_users
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
  -- 获取更新前后的数据
  DECLARE oldName VARCHAR(100);
  DECLARE newName VARCHAR(100);
  
  SET oldName = OLD.name;
  SET newName = NEW.name;
  
  -- 在控制台输出更新前后的数据
  SELECT CONCAT('Updated: ', oldName, ' => ', newName) AS message;
END //

CREATE TRIGGER after_delete_users
AFTER DELETE ON users
FOR EACH ROW
BEGIN
  -- 获取删除的数据
  DECLARE name VARCHAR(100);
  
  SET name = OLD.name;
  
  -- 在控制台输出删除的数据
  SELECT CONCAT('Deleted: ', name) AS message;
END //

DELIMITER ;

INSERT INTO users (name