Oracle эквивалентен MySQL INSERT IGNORE?

Мне нужно обновить запрос, чтобы он проверял 9X_duplicate-data отсутствие повторяющейся записи перед вставкой. В 9X_duplicate MySQL я могу просто использовать INSERT 9X_duplicate IGNORE, чтобы при обнаружении повторяющейся 9X_no-duplicates записи она просто пропускала вставку, но 9X_duplicate я не могу найти эквивалентный вариант для 9X_duplicate-data Oracle. Есть предложения?

28
0
6
Общее количество ответов: 6

Ответ #1

Ответ на вопрос: Oracle эквивалентен MySQL INSERT IGNORE?

Если вы используете 11g, вы можете использовать 9X_inserts подсказку 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. 

31
1

  • да, я недавно пришел к разработке Orac ...

Ответ #2

Ответ на вопрос: Oracle эквивалентен MySQL INSERT IGNORE?

Ознакомьтесь с оператором MERGE. Это должно 9X_deduplication делать то, что вы хотите - это сделает предложение 9X_no-duplicates WHEN NOT MATCHED.

В связи с отсутствием поддержки Oracle 9X_oracle предложения истинных VALUES() синтаксис 9X_no-duplicates для отдельной записи с фиксированными значениями 9X_duplication довольно неуклюжий:

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

Другой подход (если вы, например, выполняете 9X_duplicate массовую загрузку из другой таблицы) заключается 9X_duplicate-content в использовании средства Oracle «Регистрация 9X_inserts ошибок». Заявление будет выглядеть так:

 INSERT INTO your_table (col1, col2, col3) SELECT c1, c2, c3 FROM staging_table LOG ERRORS INTO errlog ('some comment') REJECT LIMIT UNLIMITED; 

После 9X_oracle этого в таблице errlog будут доступны все строки, которые 9X_duplicate-content могут вызвать ошибку. Вам нужно создать 9X_deduplication эту таблицу errlog (или любое другое имя по вашему 9X_duplicate-data выбору) вручную перед запуском вставки с 9X_duplication помощью DBMS_ERRLOG.CREATE_ERROR_LOG.

Подробности см. в руководстве

29
2

  • Разве ключевое слово `FROM` не должно быть заменено ключевым словом` USING`? При необходимости посмотрите http://stackoverflow.com/questions/16414747/oracle-equival ...

Ответ #3

Ответ на вопрос: Oracle эквивалентен MySQL INSERT IGNORE?

Я не думаю, что есть, но для экономии времени 9X_duplicate вы можете попытаться вставить и проигнорировать 9X_duplicates неизбежную ошибку:

begin insert into table_a( col1, col2, col3 ) values ( 1, 2, 3 ); exception when dup_val_on_index then null; end; / 

При этом будут игнорироваться 9X_duplicate-data только исключения, вызванные определенным 9X_duplicate дублированием первичного ключа или ограничений 9X_duplicate-content уникального ключа; все остальное будет поднято 9X_duplicate-data как обычно.

Если вы не хотите этого делать, вам 9X_duplicate-data нужно сначала выбрать из таблицы, что на 9X_insert самом деле не так эффективно.

10
0

Ответ #4

Ответ на вопрос: Oracle эквивалентен MySQL INSERT IGNORE?

Другой вариант

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) 

или вы могли бы сделать

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 

9X_insert

4
0

Ответ #5

Ответ на вопрос: Oracle эквивалентен MySQL INSERT IGNORE?

Простое решение

insert into t1 select from t2 where not exists (select 1 from t1 where t1.id= t2.id) 

9X_duplicates

1
0

Ответ #6

Ответ на вопрос: Oracle эквивалентен MySQL INSERT IGNORE?

Этот не мой, но очень пригодился при использовании 9X_duplicate sqlloader:

  1. создайте представление, указывающее 9X_duplicate-removal на вашу таблицу:

    CREATE OR REPLACE VIEW test_view AS SELECT * FROM test_tab 
  2. создать триггер:

    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; 
  3. и в файле 9X_duplicate-data ctl вместо этого вставьте в представление:

    OPTIONS(ERRORS=0) LOAD DATA INFILE 'file_with_duplicates.csv' INTO TABLE test_view FIELDS TERMINATED BY ',' (id, field1) 

1
0