Я нашел очень похожую тему на Oracle Equivalent to MySQL INSERT IGNORE? Однако я не мог сделать работу ни одним из предлагаемых решений. Мой случай немного особенный, так как моя таблица содержит только 1 поле, которое является первичным ключом. Давайте назовем поле «id» и таблицу «myTable» в следующем.Оракул эквивалент INSERT IGNORE
Использование MERGE
merge into myTable t1 from (
select 42 as the_pk_value, 'TEST' as some_column from dual
) t2 on (t1.id = t2.the_pk_value)
when not matched then
insert (id) values (t2.the_pk_value);
Эта первая попытка выдает сообщение об ошибке в SQL Error: ORA-02012: missing USING keyword
. Я должен признать, что я НЕ понял предложенный синтаксис, поэтому, возможно, я что-то испортил, адаптировавшись к моей таблице pk-only-table. Но поскольку показанный пример не использовал ключевое слово USING
, я не понимаю, где моя ошибка.
Используя подсказку
insert /*+ ignore_row_on_dupkey_index(SPSECU, PK_SPSECU) */ into myTable (id) values ('TEST');
Это работает через SQL Developer, однако он не работает с Java (я подозреваю, OJDBC драйвер, чтобы удалить комментарии, чтобы уменьшить размер передачи. Кстати, я не мог понять, какие драйвер JDBC Я использую ... расслоение Spring Tool Source кажется для подключения без дополнительной конфигурации к базе данных Oracle. Я вижу, установлен только драйвер DERBY по умолчанию.
Использование NOT EXISTS
Я не мог заставить этот синтаксис работать. Вот что я писал:
insert into myTable (id) values ('TEST') where not exists (select id from myTable where id='TEST');
Я получаю ошибку SQL Error: ORA-00933: SQL command not properly ended
с этой версией.
Использование вставки выберите
Я ничего предлагаемого решения по knagaev не понимают ... пытаясь приспособить его к моему столу дал мне это:
insert into myTable t1 select id from myTable t2 where not exists (select 1 from t1 where t1.id = 'TEST');
Может кто-нибудь мне помочь? Я привык к простому синтаксису MySQL INSERT IGNORE и совершенно новый для Oracle (с использованием версии 11g).
Ваш синтаксис действительно работать, используя SQL Developer. Но ... по какой-то причине при вызове с Java появляется сообщение об ошибке «ORA-00001: уникальное ограничение (PK_MYTABLE)». Сообщение об ошибке печатает точный SQL-запрос, и он отлично работает, когда я копирую его в SQL Developer (первое сообщение: '1 rows merged.') следующие сообщения:' 0 rows merged.'). Есть идеи ? – Wis
Не уверен, я не эксперт по Java. Возможно, опубликовать новый вопрос Java с помощью фрагмента кода? – Andomar
Я подозреваю что-то с драйвером Oracle ... На данный момент я приму ваше решение, вы дали мне верный ответ Oracle (даже если он не прошел через Java-вызов). – Wis