You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:24:05