首页 > Oracle SQL > Oracle IGNORE_ROW_ON_DUPKEY_INDEX

Oracle IGNORE_ROW_ON_DUPKEY_INDEX

2014年2月20日 发表评论 阅读评论

 1.IGNORE_ROW_ON_DUPKEY_INDEX这个是Oracle11g新增的一个hints,它的目的是屏蔽插入时违反唯一性索引的错误,该hints只适用于INSERT

     语法:
/*+ IGNORE_ROW_ON_DUPKEY_INDEX

  ( { table, index

    | table (column [, column]... )

    }

  ) */

该语法提供了两种形式

1).,索引

2).(列名)

该列上需要有唯一索引

2.举例:

1)创建表 ID是主键

-- Create table

create table TEST3

(

  ID   NUMBER not null,

  NAME VARCHAR2(100)

);

-- Create/Recreate primary, unique and foreign key constraints 

alter table TEST3

  add constraint PK_ID primary key (ID)

  using index 

  tablespace USERS;

 

2)插入一条数据

19:52:39 SCOTT@ orcl>insert into test3 values (1,'Tom');


已创建 1 行。


已用时间:  00: 00: 00.08

20:10:22 SCOTT@ orcl>commit;


提交完成。


已用时间:  00: 00: 00.00

3)重新执行

20:10:25 SCOTT@ orcl>insert into test3 values (1,'Tom');

insert into test3 values (1,'Tom')

*

第 1 行出现错误:

ORA-00001: 违反唯一约束条件 (SCOTT.PK_ID)

已用时间:  00: 00: 00.00

此时可以使用该hints:

20:13:33 SCOTT@ orcl>insert/*+IGNORE_ROW_ON_DUPKEY_INDEX(test3,pk_id)*/into test3 values (1,'Tom');


已创建0行。


已用时间:  00: 00: 00.00

这样后面的脚本就可以继续执行了。

换另外一种方式:

20:17:39 SCOTT@ orcl>insert/*+IGNORE_ROW_ON_DUPKEY_INDEX(test3(id))*/into test3 values (1,'Tom');


已创建0行。


已用时间:  00: 00: 00.00

效果是一样的

3)hints和其他hints一样当语法错误时,会忽略该hints,但如果是语义错误就会发生抛出错误

20:21:43 SCOTT@ orcl>insert/*+IGNORE_ROW_ON_DUPKEY_INDEX(test3(name))*/into test3 values (1,'Tom');

insert/*+IGNORE_ROW_ON_DUPKEY_INDEX(test3(name))*/into test3 values (1,'Tom')

                                                       *

第 1 行出现错误:

ORA-38913: 索引提示中指定的索引无效


已用时间:  00: 00: 00.00

如果是语法错误:

20:22:11 SCOTT@ orcl>insert/*+IGNORE_ROW_ON_DUPKEY_INDEX(aaa)*/into test3 values (1,'Tom');

insert/*+IGNORE_ROW_ON_DUPKEY_INDEX(aaa)*/into test3 values (1,'Tom')

*

第 1 行出现错误:

ORA-00001: 违反唯一约束条件 (SCOTT.PK_ID)

已用时间:  00: 00: 00.00

发生了语法错误忽略了该hints抛出了唯一性约束错误

温馨提示:

语法和语义的区别:

语法是规定好的一些规则

select * from dual; 如果把from写出form就是语法错误,因为人家规定是from你偏偏写错了嘛!

语义就是你要干什么

select * from test;这个语法上是没有问题的,如果该用户不能访问test就发生了语义错误,你要访问test表,可是人家不存在嘛!

分类: Oracle SQL 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.