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:
Crea una vista que apunte a tu mesa:
CREATE OR REPLACE VIEW test_view AS SELECT * FROM test_tab
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;
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.