Oracle相当于MySQL INSERT IGNORE?

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)

  • 是的,我最近到达了甲骨文开发,我很困惑这些技巧的数量,以实现我曾经认为是简单的事情与sql :) (2认同)

Ben*_*Ben 8

我不认为只有节省时间你可以尝试插入并忽略不可避免的错误:

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)

这只会忽略由重复主键或唯一键约束特别引发的异常; 其他一切都将照常提升.

如果你不想这样做,那么你必须先从表中选择,这实际上并不那么有效.