2010-06-30 11 views

risposta

17

Perché IGNORE non è una parola chiave in Oracle. Questa è la sintassi MySQL.

Quello che puoi fare è usare MERGE.

merge into table1 t1 
    using (select 'value1' as value1 ,value2 
      from table2 
      where table2.type = 'ok') t2 
    on (t1.value1 = t2.value1) 
when not matched then 
    insert values (t2.value1, t2.value2) 
/

Da Oracle 10g è possibile utilizzare l'unione senza gestire entrambi i rami. In 9i abbiamo dovuto utilizzare un ramo MATCHED "fittizio".

Nelle versioni più antiche le uniche opzioni erano o:

  1. di prova per l'esistenza della riga prima di emettere un inserto (o in un sub-query);
  2. per utilizzare PL/SQL per eseguire l'INSERT e gestire qualsiasi errore DUP_VAL_ON_INDEX risultante.
8

Perché hai digitato la parola spuria "ignora" tra "inserisci" e "dentro" !!

insert ignore into table1 select 'value1',value2 from table2 where table2.type = 'ok' 

dovrebbe essere:

insert into table1 select 'value1',value2 from table2 where table2.type = 'ok' 

Dal titolo della domanda "inserto oracolo se fila non esiste" Suppongo si pensava "ignora" era una parola chiave di Oracle che significa "non cercare di inserire una riga se già esiste ". Forse funziona in qualche altro DBMS, ma non in Oracle. Si potrebbe utilizzare un'istruzione MERGE, o verificare l'esistenza in questo modo:

insert into table1 
select 'value1',value2 from table2 
where table2.type = 'ok' 
and not exists (select null from table1 
       where col1 = 'value1' 
       and col2 = table2.value2 
       ); 
Problemi correlati