如何创建SQL触发器:按指定列条件过滤重复行插入
实现阻止重复列值插入的SQL触发器
需求说明
- 控制
table01表的新行插入:仅当新行的col2、col3、col5三列组合值在表中不存在时,才允许插入;若已有完全匹配的组合,则阻止插入。 - 示例:若新行
col2=B、col3=[某值]、col5=G,且表中已有这三列值完全相同的行,触发器会拦截该插入操作。
完整触发器代码
CREATE TRIGGER trig_a ON table01 INSTEAD OF INSERT AS BEGIN -- 仅插入原表中不存在col2、col3、col5组合匹配的行 INSERT INTO table01 SELECT * FROM inserted WHERE NOT EXISTS ( SELECT 1 FROM table01 t WHERE t.col2 = inserted.col2 AND t.col3 = inserted.col3 AND t.col5 = inserted.col5 ) END
逻辑说明
- 使用
INSTEAD OF INSERT触发器替代默认的插入操作,自定义插入规则。 - 通过
NOT EXISTS子查询检查:待插入行(inserted临时表)的col2、col3、col5组合是否在原表table01中存在。 - 仅当子查询返回空(即无匹配行)时,才执行插入操作。
注意事项
如果col2、col3或col5可能包含NULL值,上述等式判断会失效(因为NULL = NULL结果为未知),此时需要调整条件为:
WHERE (t.col2 IS NOT DISTINCT FROM inserted.col2) AND (t.col3 IS NOT DISTINCT FROM inserted.col3) AND (t.col5 IS NOT DISTINCT FROM inserted.col5)
IS NOT DISTINCT FROM会将NULL视为相等,适用于需要包含NULL值的重复判断场景。
内容的提问来源于stack exchange,提问作者yiyipioup
相关产品推荐
相关产品推荐

