首页 文章

Oracle相当于MySQL INSERT IGNORE?

提问于
浏览
21

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

7 回答

  • 0

    查看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 中提供了所有抛出错误的行 . 在使用 DBMS_ERRLOG.CREATE_ERROR_LOG 运行插入之前,需要手动创建 errlog 表(或您选择的任何名称) .

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

  • 4

    如果您使用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.
    
  • 1

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

    begin
    
       insert into table_a( col1, col2, col3 )
       values ( 1, 2, 3 );
    
       exception when dup_val_on_index then 
          null;
    
    end;
    /
    

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

    如果你不想这样做,那么你必须先从表中选择,这实际上并不那么有效 .

  • 26

    另一种变体

    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
    
  • 17

    简单的解决方案

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

    如何简单地添加一个索引,你需要检查哪些字段,并说它必须是唯一的?保存读取检查 .

  • 0

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

    • 创建一个指向您的表的视图:
    CREATE OR REPLACE VIEW test_view
    AS SELECT * FROM test_tab
    
    • 创建触发器:
    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;
    
    • 并在ctl文件中,插入到视图中:
    OPTIONS(ERRORS=0)
    LOAD DATA
    INFILE 'file_with_duplicates.csv'
    INTO TABLE test_view
    FIELDS TERMINATED BY ','
    (id, field1)
    

相关问题