必须用 BEFORE INSERT OR UPDATE。它在数据落盘前执行,可通过 RAISE EXCEPTION 或 SIGNAL 中断事务,确保脏数据不写入;AFTER INSERT 已无法回滚,强一致性被破坏。触发器里用 AFTER INSERT 还是 BEFORE INSERT?BEFORE INSERT 是唯一能真正阻止脏数据写入的时机。它在数据落盘前执行,一旦触发器抛出异常(比如 RAISE EXCEPTION),整个事务就会回滚;而 AFTER INSERT 已经写进表了,再报错也晚了------脏数据已存在,只能靠后续清理,强一致性就破了。PostgreSQL 中必须用 BEFORE INSERT OR UPDATE,配合 RAISE EXCEPTIONMySQL 的 BEFORE INSERT 可以用 SIGNAL SQLSTATE '45000' 中断SQL Server 的 INSTEAD OF INSERT 也能拦截,但逻辑要自己重写插入动作,容易漏字段校验逻辑写在触发器里,为什么常出现性能崩塌?触发器不是"加个 if 就完事"。每次插入都执行全量校验逻辑,如果里面包含子查询、JOIN 或调用函数,会迅速拖垮吞吐量。避免在触发器里查大表:比如校验用户状态时去 users 表查 is_active = true,不如把必要字段冗余到当前表或用缓存键值对不要调用外部 API 或执行文件 I/O ------ 触发器必须是纯数据库内操作PostgreSQL 中慎用 EXECUTE 动态 SQL,解析开销高,且无法被计划器优化示例(PostgreSQL):CREATE OR REPLACE FUNCTION check_order_amount() RETURNS TRIGGER AS BEGIN IF NEW.amount \<= 0 THEN RAISE EXCEPTION 'amount must be positive'; END IF; IF (SELECT COUNT(\*) FROM orders WHERE user_id = NEW.user_id) \> 100 THEN RAISE EXCEPTION 'user % exceeded order limit', NEW.user_id; END IF; RETURN NEW;END; LANGUAGE plpgsql;第二条 SELECT COUNT(*) 就是典型隐患:每插一条都扫一遍该用户的全部订单。 知网AI智能写作 知网AI智能写作,写文档、写报告如此简单
相关推荐
cnskylee4 分钟前
【MySQL】麒麟V10 SP3系统安装MySQL-Commercial-8.0.46梦幻通灵5 分钟前
修改MySQL数据库递增序列【持续更新】liminla!8 分钟前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)tongyiixiaohuang14 分钟前
供应商主数据同步实战:从易快报到金蝶云星空的单一策略落地卡提西亚27 分钟前
FastAPI基础入门fanruitian42 分钟前
python 机器学习 ML LinearRegression KNN KMeans鱼宵1 小时前
取集合第一个元素,Java 为什么要写三种写法?卷无止境1 小时前
给AI装上一双眼睛:快速构建代码验证器的思路与落地方案大侠归来1 小时前
常用 MySQL 分库分表方案详解维克兜率天1 小时前
【维克】指数调整:哪些股票会被“强制买入“?