Oracle11.2新特性之INSERT提示IGNORE_ROW_ON_DUPKEY_INDEX
来源:互联网 发布:使命召唤审判枪数据 编辑:程序博客网 时间:2024/06/02 13:28
insert提示IGNORE_ROW_ON_DUPKEY_INDEX
转自:http://space.itpub.net/18922393/viewspace-752123
在 insert into tablea ...select * from tableb中,如果存在唯一约束,会导致整个insert操作失败。使用IGNORE_ROW_ON_DUPKEY_INDEX提示,会忽略唯一约束冲突,回滚当前行,继续完成其他行的插入。
1,注意:
(1)如下三个提示CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, RETRY_ON_ROW_CHANGE与其他提示不同,特别之处在于存在“语义效果(semantic effect)”。
“semantic effect”指在违反以下规则时该提示会导致错误信息:
*如果指定了索引名称,该索引必须存在且唯一;否则会导致ORA-38913错误;
*如果指定索引,必须指定一个索引。如果未指定索引,会导致ORA-38912错误;如果指定了多个索引,会导致ORA-38915错误。
*不能同时指定CHANGE_DUPKEY_ERROR_INDEX和IGNORE_ROW_ON_DUPKEY_INDEX提示;否则会导致ORA-38915错误。
提示CHANGE_DUPKEY_ERROR_INDEX有两种用法,一种是指定索引的名称,另一种是指明所有构成索引的列。
需要注意的是,这个HINT只对唯一索引生效,而对唯一约束无效:
(2)与其他提示相同,存在语法错误的提示将被忽略.
(3)该提示仅适用于单个表的insert操作。
2,测试:
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected asmh@boclink
SQL>
SQL> drop table test;
Table dropped
SQL> create table test(x int,y int);
Table created
SQL> insert into test values(1,1);
1 row inserted
SQL> insert into test values(2,2);
1 row inserted
SQL> insert into test values(3,3);
1 row inserted
SQL> commit;
Commit complete
SQL> create unique index uidx_test_x on test(x);
Index created
SQL> drop table test2;
Table dropped
SQL> create table test2
2 as
3 select * from test;
Table created
SQL> insert into test2 values(4,4);
1 row inserted
SQL> insert into test2 values(5,5);
1 row inserted
SQL> commit;
Commit complete
SQL> insert into test
2 select * from test2;
insert into test
select * from test2
ORA-00001: 违反唯一约束条件 (MH.UIDX_TEST_X)
SQL> rollback;
Rollback complete
SQL> insert into test
2 select * from test2;
insert into test
select * from test2
ORA-00001: 违反唯一约束条件 (MH.UIDX_TEST_X)
SQL> commit;
Commit complete
SQL> insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(test(x)) */into test
2 select * from test2;
2 rows inserted
SQL> commit;
Commit complete
SQL> select * from test;
X Y
--------------------------------------- ---------------------------------------
1 1
2 2
3 3
4 4
5 5
SQL>
SQL>
SQL> insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(test,uidx_test_x) */into test
2 select * from test2;
0 rows inserted
SQL> commit;
Commit complete
转自:http://space.itpub.net/18922393/viewspace-752123
在 insert into tablea ...select * from tableb中,如果存在唯一约束,会导致整个insert操作失败。使用IGNORE_ROW_ON_DUPKEY_INDEX提示,会忽略唯一约束冲突,回滚当前行,继续完成其他行的插入。
1,注意:
(1)如下三个提示CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, RETRY_ON_ROW_CHANGE与其他提示不同,特别之处在于存在“语义效果(semantic effect)”。
“semantic effect”指在违反以下规则时该提示会导致错误信息:
*如果指定了索引名称,该索引必须存在且唯一;否则会导致ORA-38913错误;
*如果指定索引,必须指定一个索引。如果未指定索引,会导致ORA-38912错误;如果指定了多个索引,会导致ORA-38915错误。
*不能同时指定CHANGE_DUPKEY_ERROR_INDEX和IGNORE_ROW_ON_DUPKEY_INDEX提示;否则会导致ORA-38915错误。
提示CHANGE_DUPKEY_ERROR_INDEX有两种用法,一种是指定索引的名称,另一种是指明所有构成索引的列。
需要注意的是,这个HINT只对唯一索引生效,而对唯一约束无效:
(2)与其他提示相同,存在语法错误的提示将被忽略.
(3)该提示仅适用于单个表的insert操作。
2,测试:
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected asmh@boclink
SQL>
SQL> drop table test;
Table dropped
SQL> create table test(x int,y int);
Table created
SQL> insert into test values(1,1);
1 row inserted
SQL> insert into test values(2,2);
1 row inserted
SQL> insert into test values(3,3);
1 row inserted
SQL> commit;
Commit complete
SQL> create unique index uidx_test_x on test(x);
Index created
SQL> drop table test2;
Table dropped
SQL> create table test2
2 as
3 select * from test;
Table created
SQL> insert into test2 values(4,4);
1 row inserted
SQL> insert into test2 values(5,5);
1 row inserted
SQL> commit;
Commit complete
SQL> insert into test
2 select * from test2;
insert into test
select * from test2
ORA-00001: 违反唯一约束条件 (MH.UIDX_TEST_X)
SQL> rollback;
Rollback complete
SQL> insert into test
2 select * from test2;
insert into test
select * from test2
ORA-00001: 违反唯一约束条件 (MH.UIDX_TEST_X)
SQL> commit;
Commit complete
SQL> insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(test(x)) */into test
2 select * from test2;
2 rows inserted
SQL> commit;
Commit complete
SQL> select * from test;
X Y
--------------------------------------- ---------------------------------------
1 1
2 2
3 3
4 4
5 5
SQL>
SQL>
SQL> insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(test,uidx_test_x) */into test
2 select * from test2;
0 rows inserted
SQL> commit;
Commit complete
1 0
- Oracle11.2新特性之INSERT提示IGNORE_ROW_ON_DUPKEY_INDEX
- Oracle11.2新特性之INSERT提示IGNORE_ROW_ON_DUPKEY_INDEX
- Oracle11.2新特性之listagg函数
- Oracle11.2新特性之listagg函数
- Oracle11.2新特性之listagg函数
- Oracle11.2新特性之列转行函数listagg
- Oracle11.2新特性之listagg函数 (行列转换)
- Oracle11.2新特性之listagg函数(多条数据用逗号隔开)
- oracle11.2.0.1新特性
- Oracle11新特性——虚拟列
- Oracle11新特性——虚拟列
- Oracle11新特性——虚拟列
- Oracle11新特性——虚拟列
- Oracle11新特性——在线操作功能增强之可等待DDL
- Oracle11新特性——在线操作功能增强之表增加包含默认值的字段
- Oracle11新特性——在线操作功能增强之对象依赖性判断增强
- Oracle11新特性——在线操作功能增强之新增的不可见索引
- Oracle11新特性——在线操作功能增强之新增只读表功能
- RMAN List和report 命令
- 关于系统中使用多个PropertyPlaceholderConfigurer的配置及PropertyOverrideConfigurer
- Android:网络:多线程断点下载
- oracle 11g新特性Flashback data archive
- Python-OpenCV 处理图像(八):图像二值化处理
- Oracle11.2新特性之INSERT提示IGNORE_ROW_ON_DUPKEY_INDEX
- MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 解决方法
- oracle moving window size与 AWR retention period关系
- Spring定时任务的几种实现
- oracle Health Monitor
- Linux系统手动安装rzsz 软件包
- 我来学习excel------sumifs函数
- oracle 行链接与行迁移
- pl/sql集合类型