Oracle IGNORE_ROW_ON_DUPKEY_INDEX
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表,可是人家不存在嘛!