在11.2中,Oracle新增了一个HINT,使得INSERT INTO SELECT操作可以避免插入重复的记录。
首先创建一个包含主键的表:
SQL> CREATE TABLE T
2 (ID NUMBER,
3 NAME VARCHAR2(30),
4 CONSTRAINT PK_T PRIMARY KEY (ID));
表已创建。
SQL> INSERT INTO T
2 SELECT ROWNUM, OBJECT_NAME
3 FROM DBA_OBJECTS
4 WHERE ROWNUM <= 200;
已创建200行。
SQL> SELECT *
2 FROM T
3 WHERE ID = 100;
ID NAME
---------- ------------------------------
100 FIXED_OBJ$
下面清空表中数据,然后插入一条记录:
SQL> TRUNCATE TABLE T;
表被截断。
SQL> INSERT INTO T
2 VALUES (100, 'TEST');
已创建 1 行。
SQL> COMMIT;
提交完成。
下面执行普通的INSERT INTO SELECT语句,会由于重复记录的存在而报错:
SQL> INSERT INTO T
2 SELECT ROWNUM, OBJECT_NAME
3 FROM DBA_OBJECTS
4 WHERE ROWNUM <= 200;
INSERT INTO T
*第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (YANGTK.PK_T)
通过使用新增的提示,可以避免插入重复的记录:
SQL> INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(T, PK_T) */
2 INTO T
3 SELECT ROWNUM, OBJECT_NAME
4 FROM DBA_OBJECTS
5 WHERE ROWNUM <= 200;
已创建199行。
除了指定索引名称外,这个HINT还有另一种写法,指定主键列:
SQL> ROLLBACK;
回退已完成。
SQL> INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(T(ID)) */
2 INTO T
3 SELECT ROWNUM, OBJECT_NAME
4 FROM DBA_OBJECTS
5 WHERE ROWNUM <= 200;
已创建199行。
SQL> COMMIT;
提交完成。
SQL> SELECT *
2 FROM T
3 WHERE ID = 100;
ID NAME
---------- ------------------------------
100 TEST
如果不关联当前表的话,这个功能只能通过PL/SQL实现,而现在可以通过加上IGNORE_ROW_ON_DUPKEY_INDEX的一条INSERT语句实现。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24383181/viewspace-750308/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24383181/viewspace-750308/