mysql触发器实现一表插入数据,另一表自动更新新指定数据

CREATE DEFINER=`root`@`localhost` TRIGGER `after_insert` AFTER INSERT ON `student` FOR EACH ROW begin -- 触发器内容开始
	-- 触发器内容主体,每行用分号结尾
	update course set grade = grade+1 where new.classid=course.id;
end

插入数据表名:student 

更新数据是course表grade

只是实验没关心逻辑,上面代码实现了在 student 插入一条数据,course表中满足 course.id = 插入数据的 classid 的所有数据的grade加1

扩展:

CREATE DEFINER=`root`@`localhost` TRIGGER `after_insert_post` AFTER INSERT ON `post` FOR EACH ROW begin -- 触发器内容开始
	-- 触发器内容主体,每行用分号结尾
	update invitation set count = count+1 where new.invitationid=invitation.invitationid;
	update invitation set lastposter = (select usre_name from users where users.userid = new.userid) where new.invitationid=invitation.invitationid;
	update invi
### 使用MySQL触发器数据 #### 创建触发器般语法 创建触发器的通用语法结构如下[^2]: ```sql CREATE TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name FOR EACH ROW BEGIN -- 触发器逻辑处理 END; ``` 此语法允许指定触发器是在目标事件(`INSERT`, `UPDATE`, 或者 `DELETE`)发生前还是发生后执行。 #### 实现自动更新关联数据 假设存在两个格:`orders` 和 `customers`。每当订单(`orders`)被删除时,希望减少客户(`customers`)账户余额相应的金额。为此目的设计了一个名为 `reduce_balance_on_delete_order` 的触发器: ```sql DELIMITER $$ CREATE TRIGGER reduce_balance_on_delete_order AFTER DELETE ON orders FOR EACH ROW BEGIN UPDATE customers SET balance = balance - OLD.amount WHERE id = OLD.customer_id; END$$ DELIMITER ; ``` 上述代码片段展示了如何通过触发器,在每次从 `orders` 中删除条记录之后,相应地调整 `customers` 内的余额字段。这里的关键在于使用了 `OLD` 关键字访问已删除行的内容,并据此更中的信息。 #### 数据验证示例 为了确保插入或更后的价格总是正数,可以在 `products` 上设置一个触发器来进行这样的检查: ```sql DELIMITER $$ CREATE TRIGGER validate_price_before_update_or_insert BEFORE INSERT OR UPDATE ON products FOR EACH ROW BEGIN IF NEW.price <= 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Price must be positive'; END IF; END$$ DELIMITER ; ``` 这段脚本会在尝试向 `products` 插入或者更任何行之前运行,如果发现的价格小于等于零,则抛出异常阻止该操作完成。 #### 日志记录功能 考虑建立张专门的日志 (`audit_log`) 来保存所有对重要业务实体 (比如 `employees`) 所做的变更历史。下面是一个简单的例子说明怎样利用触发器来填充这张日志: ```sql -- 首先创建审计日志 CREATE TABLE audit_log ( log_id INT AUTO_INCREMENT PRIMARY KEY, action VARCHAR(10), employee_id INT NOT NULL, changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); DELIMITER $$ CREATE TRIGGER log_employee_changes AFTER UPDATE ON employees FOR EACH ROW BEGIN INSERT INTO audit_log(action, employee_id) VALUES ('UPDATED', OLD.id); END$$ DELIMITER ; ``` 当员工资料有任何变动时,这个触发器会自动生成一个的条目加入到 `audit_log` 中去,从而留下完整的活动轨迹供后续审查之用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值