oracle insert duplicates

Oracle equivalente a MySQL ¿INSERTAR IGNORAR?



duplicates (7)

Necesito actualizar una consulta para que compruebe que no existe una entrada duplicada antes de la inserción. En MySQL solo puedo usar INSERT IGNORE para que si se encuentra un registro duplicado solo omita la inserción, pero parece que no puedo encontrar una opción equivalente para Oracle. ¿Alguna sugerencia?


¿Qué tal si simplemente agrega un índice con los campos que necesita para verificar si hay duplicados y dice que debe ser único? Guarda un cheque de lectura.


Este no es mío, pero fue muy útil al usar sqlloader:

  1. Crea una vista que apunte a tu mesa:

    CREATE OR REPLACE VIEW test_view AS SELECT * FROM test_tab

  2. crear el gatillo:

    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. y en el archivo ctl, insértelo en la vista en su lugar:

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


No creo que haya, pero para ahorrar tiempo puede intentar insertar e ignorar el error inevitable:

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

Esto solo ignorará las excepciones generadas específicamente por clave principal duplicada o restricciones de clave única; Todo lo demás se levantará como de costumbre.

Si no quieres hacer esto, primero debes seleccionar de la tabla, lo que no es realmente tan eficiente.


Otra variante

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)

o podrías hacer

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


Si estás en 11g puedes usar la pista 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.


Una solución simple

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


Echa un vistazo a la declaración MERGE. Esto debería hacer lo que usted quiere: es la cláusula WHEN NOT MATCHED que hará esto.

Sin embargo, la falta de compatibilidad de Oracle con una verdadera cláusula VALUES () hace que la sintaxis de un registro único con valores fijos sea bastante torpe:

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

Un enfoque diferente (si, por ejemplo, está realizando una carga masiva desde una tabla diferente) es utilizar la función "Registro de errores" de Oracle. La declaración se vería así:

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

Después, todas las filas que habrían arrojado un error estarán disponibles en la tabla errlog . errlog crear esa tabla de errlog (o el nombre que elija) manualmente antes de ejecutar la inserción utilizando DBMS_ERRLOG.CREATE_ERROR_LOG .

Consulte el manual para más detalles.