Bad*_*mer 23 oracle insert duplicates
我需要更新一个查询,以便在插入之前检查重复的条目是否存在.在MySQL中我可以使用INSERT IGNORE,这样如果找到重复的记录,它只是跳过插入,但我似乎找不到Oracle的等效选项.有什么建议?
a_h*_*ame 29
查看MERGE语句.这应该做你想要的 - 这WHEN NOT MATCHED是将执行此操作的条款.
对Oracle缺乏对真正的VALUES()子句的支持,具有固定值的单个记录的语法是非常笨拙的:
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);
Run Code Online (Sandbox Code Playgroud)
另一种方法(如果您从不同的表进行批量加载)是使用Oracle的"错误日志记录"工具.声明如下:
INSERT INTO your_table (col1, col2, col3)
SELECT c1, c2, c3
FROM staging_table
LOG ERRORS INTO errlog ('some comment') REJECT LIMIT UNLIMITED;
Run Code Online (Sandbox Code Playgroud)
之后,表中将提供所有可能引发错误的行errlog.errlog在运行插入之前,您需要手动创建该表(或您选择的任何名称)DBMS_ERRLOG.CREATE_ERROR_LOG.
有关详细信息,请参阅手册
Jon*_*ler 21
如果您使用的是11g,则可以使用提示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.
Run Code Online (Sandbox Code Playgroud)
我不认为只有节省时间你可以尝试插入并忽略不可避免的错误:
begin
insert into table_a( col1, col2, col3 )
values ( 1, 2, 3 );
exception when dup_val_on_index then
null;
end;
/
Run Code Online (Sandbox Code Playgroud)
这只会忽略由重复主键或唯一键约束特别引发的异常; 其他一切都将照常提升.
如果你不想这样做,那么你必须先从表中选择,这实际上并不那么有效.