oracle在插入表之前检查重复值

时间:2018-08-01 02:59:09

标签: oracle plsql insert

我有两个函数可以在插入表之前检查重复值,但是我不知道哪种方法更有效?

第一种方法:

select count(*)
      into ln_rec_cnt
      from ieexco_tbl t
     where t.ieexco_dept_code = p_dept
       and NVL(t.IEEXCO_SEQ, '|') = NVL(p_indx, '|')
    if ln_rec_cnt > 0 then
      raise_application_error(-20001, 'Save coordinator record repeatedly');
    end if;

第二种方法:

insert into ieexco_tbl t
            (IEEXCO_DEPT_CODE,
             IEEXCO_SEQ,
             IEEXCO_NAME,
             IEEXCO_PHONE,
             IEEXCO_EMAIL,
             IEEXCO_CREATE_DATE,
             IEEXCO_OPR_PIDM)
 select 
             p_dept,
             p_indx(i),
             p_name(i),
             p_tel(i),
             p_email(i),
             sysdate,
             p_opr_pidm 
from dual 
where not exists(SELECT 1 
                 FROM ieexco_tbl 
                 WHERE IEEXCO_DEPT_CODE = p_dept
                 and NVL(IEEXCO_SEQ,'|')= NVL(p_indx(i),'|'));

2 个答案:

答案 0 :(得分:2)

都不是。 执行插入操作,并响应(忽略)DUP_VAL_ON_INDEX异常。

在并发方面,这是最安全的方法,就像其他人已完成插入但未提交一样,插入将在锁定的记录上等待,然后在其他事务提交时出错(如果其他事务回滚则成功)。

答案 1 :(得分:-3)

第二种方法很快

INSERT...
SELECT
      Column_Name 
FROM dual WHERE NOT EXISTS (SELECT 1 FROM ..)

还要检查unique key

的结构