Oracle эквивалентен MySQL INSERT IGNORE?
Мне нужно обновить запрос, чтобы он проверял 9X_duplicate-data отсутствие повторяющейся записи перед вставкой. В 9X_duplicate MySQL я могу просто использовать INSERT 9X_duplicate IGNORE, чтобы при обнаружении повторяющейся 9X_no-duplicates записи она просто пропускала вставку, но 9X_duplicate я не могу найти эквивалентный вариант для 9X_duplicate-data Oracle. Есть предложения?
Ответ #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.
- да, я недавно пришел к разработке 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
.
Подробности см. в руководстве
- Разве ключевое слово `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 самом деле не так эффективно.
Ответ #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
Ответ #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
Ответ #6
Ответ на вопрос: Oracle эквивалентен MySQL INSERT IGNORE?
Этот не мой, но очень пригодился при использовании 9X_duplicate sqlloader:
-
создайте представление, указывающее 9X_duplicate-removal на вашу таблицу:
CREATE OR REPLACE VIEW test_view AS SELECT * FROM test_tab
-
создать триггер:
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;
-
и в файле 9X_duplicate-data ctl вместо этого вставьте в представление:
OPTIONS(ERRORS=0) LOAD DATA INFILE 'file_with_duplicates.csv' INTO TABLE test_view FIELDS TERMINATED BY ',' (id, field1)
-
3
-
2
-
5
-
23
-
2
-
3
-
3
-
6
-
3
-
8
-
2
-
2
-
4
-
2
-
3
-
2
-
2
-
2
-
4
-
2
-
1
-
1
-
9
-
21
-
36
-
29
-
5
-
26
-
7
-
9
-
14
-
18
-
13
-
6
-
8
-
22
-
8
-
9
-
4
-
18
-
14
-
5
-
5
-
5
-
6
-
8
-
2
-
4
-
21
-
10