Oracle Equivalent to MySQL INSERT IGNORE?

后端 未结 8 2251
旧时难觅i
旧时难觅i 2020-11-27 07:24

I need to update a query so that it checks that a duplicate entry does not exist before insertion. In MySQL I can just use INSERT IGNORE so that if a duplicate record is fo

相关标签:
8条回答
  • 2020-11-27 07:55

    Another variant

    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)
    

    or you could do

    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 
    
    0 讨论(0)
  • 2020-11-27 08:01

    Check out the MERGE statement. This should do what you want - it's the WHEN NOT MATCHED clause that will do this.

    Do to Oracle's lack of support for a true VALUES() clause the syntax for a single record with fixed values is pretty clumsy though:

    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);
    

    A different approach (if you are e.g. doing bulk loading from a different table) is to use the "Error logging" facility of Oracle. The statement would look like this:

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

    Afterwards all rows that would have thrown an error are available in the table errlog. You need to create that errlog table (or whatever name you choose) manually before running the insert using DBMS_ERRLOG.CREATE_ERROR_LOG.

    See the manual for details

    0 讨论(0)
提交回复
热议问题