在ORACLE SQL中防止CODE与CAR列组合重复插入并自定义报错
Oracle 自定义组合列唯一校验实现方案
如果你不想使用唯一约束实现CODE与CAR列的组合值唯一校验,可通过BEFORE INSERT 行级触发器实现,具体操作如下:
1. 前提说明
假设你要校验的表名为VEHICLE_RECORDS,请替换为你实际的业务表名。
2. 创建触发器
直接执行以下SQL创建校验触发器:
CREATE OR REPLACE TRIGGER trg_check_unique_code_car BEFORE INSERT ON VEHICLE_RECORDS FOR EACH ROW DECLARE v_exist_count NUMBER; BEGIN -- 查询待插入的CODE+CAR组合是否已存在 SELECT COUNT(1) INTO v_exist_count FROM VEHICLE_RECORDS WHERE CODE = :NEW.CODE AND CAR = :NEW.CAR AND ROWNUM = 1; -- 加ROWNUM优化查询性能,找到一条匹配记录就终止查询 IF v_exist_count > 0 THEN -- 抛出自定义错误,错误码使用Oracle预留的自定义区间-20001~-20999 RAISE_APPLICATION_ERROR(-20001, 'CODE & CAR values must be unique'); END IF; END; /
3. 效果验证
执行重复插入语句测试:INSERT INTO VEHICLE_RECORDS (CODE, CAR) VALUES (7, 'AUTO');
会直接返回你指定的错误提示:
ORA-20001: CODE & CAR values must be unique
ORA-06512: 在 "TRG_CHECK_UNIQUE_CODE_CAR", line 14
ORA-04088: 触发器 'TRG_CHECK_UNIQUE_CODE_CAR' 执行过程中出错
4. 扩展说明
- 如果需要UPDATE操作也校验该规则,只需将触发器触发条件修改为
BEFORE INSERT OR UPDATE即可 - 高并发插入场景下建议搭配表级共享锁优化,避免幻读导致的校验失效
- 批量插入场景可改为语句级触发器降低性能开销
内容的提问来源于stack exchange,提问作者Tom AL
相关产品推荐
相关产品推荐

