вставка оракула, если строка не существует - PullRequest
14 голосов
/ 30 июня 2010
insert ignore into table1 
select 'value1',value2 
from table2 
where table2.type = 'ok'

При запуске я получаю сообщение об ошибке «отсутствует ключевое слово INTO».

Есть идеи?

Ответы [ 3 ]

21 голосов
/ 30 июня 2010

При запуске я получаю сообщение об ошибке «отсутствует ключевое слово INTO».

Потому что IGNORE не является ключевым словом в Oracle. Это синтаксис MySQL.

Что вы можете сделать, это использовать 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)
/

Из Oracle 10g мы можем использовать слияние, не обрабатывая обе ветви. В 9i нам пришлось использовать "фиктивную" ветвь MATCHED.

В более древних версиях единственными вариантами были либо:

  1. проверка существования строки перед выполнением INSERT (или в подзапросе);
  2. для использования PL / SQL для выполнения INSERT и обработки любой результирующей ошибки DUP_VAL_ON_INDEX.
8 голосов
/ 30 июня 2010

Поскольку вы ввели ложное слово «игнорировать» между «вставить» и «в» !!

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

Должно быть:

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

Из заголовка вашего вопроса "oracle insert, если строка не существует", я полагаю, вы думали, что "ignore" было ключевым словом Oracle, что означает "не пытайтесь вставить строку, если она уже существует". Может быть, это работает в некоторых других СУБД, но не в Oracle. Вы можете использовать оператор MERGE или проверить существование следующим образом:

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
               );
7 голосов
/ 30 июня 2010

Обратите внимание, что если вам повезло работать с версией 2 версии 11g, вы можете воспользоваться подсказкой IGNORE_ROW_ON_DUPKEY_INDEX .

Из документации: http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/sql_elements006.htm#CHDEGDDG

Пример из моего блога: http://rwijk.blogspot.com/2009/10/three-new-hints.html

С уважением, Роб.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...