Oracle相当于MySQL INSERT IGNORE?

时间:2012-02-17 16:57:58

标签: oracle insert duplicates

我需要更新一个查询,以便在插入之前检查是否存在重复的条目。在MySQL中,我可以使用INSERT IGNORE,这样如果找到重复的记录,它只是跳过插入,但我似乎找不到Oracle的等效选项。有什么建议吗?

8 个答案:

答案 0 :(得分:28)

查看MERGE语句。这应该做你想要的 - 这是WHEN NOT MATCHED子句将执行此操作。

Oracle缺乏对真正的VALUES()子句的支持,但是具有固定值的单个记录的语法非常笨拙:

MERGE INTO your_table yt
USING (
   SELECT 42 as the_pk_value, 
          'some_value' as some_column
   FROM dual
) t on (yt.pk = t.the_pke_value) 
WHEN NOT MATCHED THEN 
   INSERT (pk, the_column)
   VALUES (t.the_pk_value, t.some_column);

另一种方法(例如,如果您从另一个表进行批量加载)是使用Oracle的“错误日志记录”工具。声明如下:

 INSERT INTO your_table (col1, col2, col3)
 SELECT c1, c2, c3
 FROM staging_table
 LOG ERRORS INTO errlog ('some comment') REJECT LIMIT UNLIMITED;

之后,表errlog中提供了所有可能引发错误的行。在使用errlog运行插入之前,您需要手动创建DBMS_ERRLOG.CREATE_ERROR_LOG表(或您选择的任何名称)。

有关详细信息,请参阅手册

答案 1 :(得分:19)

如果您使用11g,则可以使用提示IGNORE_ROW_ON_DUPKEY_INDEX

SQL> create table my_table(a number, constraint my_table_pk primary key (a));

Table created.

SQL> insert /*+ ignore_row_on_dupkey_index(my_table, my_table_pk) */
  2  into my_table
  3  select 1 from dual
  4  union all
  5  select 1 from dual;

1 row created.

答案 2 :(得分:8)

我不认为只是为了省时间你可以尝试插入并忽略不可避免的错误:

begin

   insert into table_a( col1, col2, col3 )
   values ( 1, 2, 3 );

   exception when dup_val_on_index then 
      null;

end;
/

这将忽略由重复主键或唯一键约束特别引发的异常;其他一切都将照常提升。

如果您不想这样做,那么您必须首先从表格中进行选择,这实际上效率不高。

答案 3 :(得分:4)

另一种变体

Insert into my_table (student_id, group_id)
select distinct p.studentid, g.groupid 
from person p, group g
where NOT EXISTS (select 1
                 from my_table a
                 where a.student_id = p.studentid
                 and a.group_id = g.groupid)

或者你可以做到

Insert into my_table (student_id, group_id)
select distinct p.studentid, g.groupid 
from person p, group g
MINUS
select student_id, group_id
from my_table 

答案 4 :(得分:1)

一个简单的解决方案

insert into t1
  select from t2 
  where not exists 
    (select 1 from t1 where t1.id= t2.id)

答案 5 :(得分:0)

如何简单地添加索引以及检查dupes所需的任何字段,并说它必须是唯一的?保存读取检查。

答案 6 :(得分:0)

这个不是我的,但在使用sqlloader时非常方便:

  1. 创建一个指向您的表的视图:

    CREATE OR REPLACE VIEW test_view
    AS SELECT * FROM test_tab
    
  2. 创建触发器:

    CREATE OR REPLACE TRIGGER test_trig
     INSTEAD OF INSERT ON test_view
     FOR EACH ROW
      BEGIN
       INSERT INTO test_tab VALUES
        (:NEW.id, :NEW.name);
      EXCEPTION
       WHEN DUP_VAL_ON_INDEX THEN NULL;
      END test_trig;
    
  3. 并在ctl文件中,插入到视图中:

    OPTIONS(ERRORS=0)
    LOAD DATA
    INFILE 'file_with_duplicates.csv'
    INTO TABLE test_view
    FIELDS TERMINATED BY ','
    (id, field1)
    

答案 7 :(得分:0)

还有另一个“不存在的地方”-使用双重...变体...

insert into t1(id, unique_name)
  select t1_seq.nextval, 'Franz-Xaver' from dual 
    where not exists (select 1 from t1 where unique_name = 'Franz-Xaver');