如何在执行删除操作时基于单一属性从关联表取数填充至logs表
实现方案
有两种常用的实现方式,你可以根据自己的场景选择:
方案1:数据库触发器(全自动,无需修改原有删除逻辑)
直接在数据库层面为cars表的删除操作绑定后置触发器,只要执行删除操作就会自动写入日志,适合所有删除cars表数据都需要同步日志的场景。
以MySQL为例,触发器创建代码如下:
DELIMITER // CREATE TRIGGER after_cars_delete AFTER DELETE ON cars FOR EACH ROW BEGIN INSERT INTO logs (content) SELECT CONCAT(firstname, lastname, '已从表中删除') FROM users WHERE userid = OLD.userid; END // DELIMITER ;
说明:
OLD是触发器内置变量,指代刚刚被删除的行数据,这里取删除行对应的userid关联用户表拼接日志内容- 触发器创建完成后,你原来的删除语句
DELETE FROM cars WHERE userid=1;完全不用修改,执行后会自动生成日志
方案2:事务包裹手动写入(无需修改数据库结构,仅单次场景适用)
如果只是当前这一个删除场景需要写日志,不想额外创建触发器,可以将插入日志和删除操作放在同一个事务中执行,保证两者操作一致性:
START TRANSACTION; -- 先写入日志 INSERT INTO logs (content) SELECT CONCAT(firstname, lastname, '已从表中删除') FROM users WHERE userid = 1; -- 再执行删除 DELETE FROM cars WHERE userid = 1; COMMIT;
说明:
- 事务会保证日志写入和删除操作要么同时成功,要么同时回滚,不会出现数据不一致的问题
- 如果有多个
userid需要批量删除,修改WHERE条件里的userid取值即可
注意事项
- 如果你的
logs表还有操作时间、操作人等其他必填字段,自行在INSERT语句中补充对应字段和取值即可 - 以上示例基于MySQL语法,如果你使用PostgreSQL、SQL Server等其他数据库,触发器语法会有小幅调整,核心逻辑保持一致即可
内容的提问来源于stack exchange,提问作者Robotboy
相关产品推荐
相关产品推荐

