sql >> Database >  >> RDS >> Oracle

Oracle 'INSERT ALL' negeert duplicaten

In Oracle slagen uitspraken volledig of mislukken volledig (ze zijn atomair). U kunt echter in bepaalde gevallen clausules toevoegen om uitzonderingen te loggen in plaats van fouten te veroorzaken:

De tweede methode is helemaal automatisch, hier is een demo (met 11gR2):

SQL> CREATE TABLE test (pk1 NUMBER,
  2                     pk2 NUMBER,
  3                     CONSTRAINT pk_test PRIMARY KEY (pk1, pk2));

Table created.

SQL> /* Statement fails because of duplicate */
SQL> INSERT into test (SELECT 1, 1 FROM dual CONNECT BY LEVEL <= 2);

ERROR at line 1:
ORA-00001: unique constraint (VNZ.PK_TEST) violated

SQL> BEGIN dbms_errlog.create_error_log('TEST'); END;
  2  /

PL/SQL procedure successfully completed.

SQL> /* Statement succeeds and the error will be logged */
SQL> INSERT into test (SELECT 1, 1 FROM dual CONNECT BY LEVEL <= 2)
  2   LOG ERRORS REJECT LIMIT UNLIMITED;

1 row(s) inserted.

SQL> select ORA_ERR_MESG$, pk1, pk2 from err$_test;

ORA_ERR_MESG$                                       PK1 PK2
--------------------------------------------------- --- ---
ORA-00001: unique constraint (VNZ.PK_TEST) violated   1   1

U kunt de LOG ERROR . gebruiken clausule met INSERT ALL (bedankt @Alex Poole ), maar je moet de clausule na elke tabel toevoegen:

SQL> INSERT ALL
  2   INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED
  3   INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED
  4  (SELECT * FROM dual);

0 row(s) inserted.


  1. foreach gebruiken om batch-insertie te doen met mybatis

  2. 6 redenen waarom Microsoft Access uw bedrijf kan helpen

  3. Kolom bijwerken op basis van overeenkomende waarden in andere tabel in mysql

  4. Haal een enkel item uit een lijstreeks in MySQL