MySQL触发器是一种特殊的存储过程,当满足特定条件时自动执行。以下是一个简单的MySQL触发器的实例。假设我们有两个表:`orders` 和 `audit_log`。每当在 `orders` 表中插入一个新订单时,我们希望将订单的详细信息记录到 `audit_log` 表中。
首先,假设我们有以下两个表的结构:
**orders 表**
```sql
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE NOT NULL,
product_name VARCHAR(255) NOT NULL,
quantity INT NOT NULL
);
```
**audit_log 表**
```sql
CREATE TABLE audit_log (
log_id INT AUTO_INCREMENT PRIMARY KEY,
action VARCHAR(50) NOT NULL, -- 例如:INSERT、UPDATE 或 DELETE
table_name VARCHAR(100) NOT NULL, -- 被操作的表名
record_data TEXT, -- 记录的数据快照
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 操作的时间戳
);
```
接下来,我们可以创建一个触发器,当向 `orders` 表中插入数据时,自动将相关信息记录到 `audit_log` 表中:
```sql
DELIMITER //
CREATE TRIGGER tr_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO audit_log(action, table_name, record_data)
VALUES ('INSERT', 'orders', CONCAT('New order added: product - ', NEW.product_name, ', quantity - ', NEW.quantity));
END; //
DELIMITER ;
```
这个触发器的功能描述如下:
* 当在 `orders` 表中插入一个新的订单时,该触发器会自动执行。
* 它会将 `action` 列设置为 'INSERT',表示刚刚执行了一个插入操作。
* 它会将 `table_name` 列设置为 'orders',表示操作的表是订单表。
* 它会将 `record_data` 列设置为新插入的订单的相关信息。这里我们使用了 `CONCAT()` 函数来拼接字符串,并使用 `NEW` 关键字来引用新插入的行中的列值。请注意,这只是一个简单的示例,实际的日志记录可能需要更详细或更复杂的信息。
* 最后,请注意使用 `DELIMITER` 命令来改变命令分隔符,以便在触发器内部使用多个语句。触发器定义结束后,我们再次使用 `DELIMITER` 恢复默认的分隔符。这是因为在MySQL中,分号是命令的默认分隔符,而触发器内部也可能需要使用分号。为了避免混淆,我们暂时更改分隔符。