oracle inserire se la riga non esiste

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

Quando lo eseguo mi esce l’errore “missing IN chiave” .

Tutte le idee ?

InformationsquelleAutor coder247 | 2010-06-30



3 Replies
  1. 21

    Quando lo eseguo mi esce l’errore “missing IN chiave” .

    Perché IGNORARE non è una parola chiave in Oracle. Che è la sintassi MySQL.

    Cosa si può fare è utilizzare UNIONE.

    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 siamo in grado di utilizzare l’unione senza la gestione di entrambi i rami. In 9i, abbiamo dovuto usare un “dummy” CORRISPONDENTE ramo.

    Più antiche versioni uniche opzioni erano :

    1. test per la riga dell’esistenza, prima di emettere un INSERTO (o in un sub-query);
    2. utilizzo di PL/SQL per eseguire il INSERIRE e gestire qualsiasi risultante DUP_VAL_ON_INDEX errore.
  2. 8

    Perché è stato digitato il spurie parola “ignora” tra “inserisci” e “in”!!

    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 “oracle inserire se la riga non esiste” presumo che hai pensato “ignorare” è stato un Oracolo, parola che significa “non tentare di inserire una riga, se è già presente”. Forse questo funziona in alcuni altri DBMS, ma non in Oracle. Si potrebbe utilizzare un’istruzione MERGE o controllare l’esistenza come questo:

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

Lascia un commento