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