今天群里有人问起rename 表操作对index的影响。今天简单说一下:
首先ORACLE官方文档对RENAME操作的说明如下:
Use theRENAME
statement to rename a table, view, sequence, or private synonym.
Oracle Database automatically transfers integrity constraints, indexes, and grants on the old object to the new object.
Oracle Database invalidates all objects that depend on the renamed object, such as views, synonyms, and stored procedures and functions that refer to a renamed table.
[可以使用rename语句来rename一个表,视图,序列或私有同义词]。
.Oracle数据库自动把旧的对象上的完整性约束,索引,和权限迁移到新的对象上面。
.Oracle数据库上涉及与命名后的对象有关的例如:视图,同义词和存储过程和函数都会失效。
1.使用scott用户创建一个测试表e1和测试索引e1_eno.
SQL> create table e1 as select * from emp;
Table created.
SQL> create index e1_eno on e1(empno);
Index created.
2.分析执行计划。
SQL> explain plan for select * from e1 where empno>7500;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12 | 1044 | 2 (0)| 00:0
0:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| E1 | 12 | 1044 | 2 (0)| 00:0
0:01 |
|* 2 | INDEX RANGE SCAN | E1_ENO | 12 | | 1 (0)| 00:0
0:01 |
3.查看index情况。
SQL> select index_name,table_owner,table_name,status from user_indexes where index_name='E1_ENO';
INDEX_NAME TABLE_OWNER
------------------------------ ------------------------------
TABLE_NAME STATUS
------------------------------ --------
E1_ENO SCOTT
E1 VALID
4.进行rename操作.
SQL> rename e1 to e2;
Table renamed.
5.查询索引情况:
SQL> select index_name,table_owner,table_name,status from user_indexes where index_name='E1_ENO';
INDEX_NAME TABLE_OWNER
------------------------------ ------------------------------
TABLE_NAME STATUS
------------------------------ --------
E1_ENO SCOTT
E2 VALID
6.按照第二步进行分析,执行计划如下:
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12 | 1044 | 2 (0)| 00:0
0:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| E2 | 12 | 1044 | 2 (0)| 00:0
0:01 |
|* 2 | INDEX RANGE SCAN | E1_ENO | 12 | | 1 (0)| 00:0
发现更改表名后,索引也同时跟着变动,依旧有效。
7.再次更换为e1看看索引情况:
SQL> rename e2 to e1;
Table renamed.
SQL> select index_name,table_owner,table_name,status from user_indexes where index_name='E1_ENO';
INDEX_NAME TABLE_OWNER
------------------------------ ------------------------------
TABLE_NAME STATUS
------------------------------ --------
E1_ENO SCOTT
E1 VALID
发现索引再次随着表的更改也进行了同步变动。
8.根据第2步再次查看执行计划:
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12 | 1044 | 2 (0)| 00:0
0:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| E1 | 12 | 1044 | 2 (0)| 00:0
0:01 |
|* 2 | INDEX RANGE SCAN | E1_ENO | 12 | | 1 (0)| 00:0
0:01 |
--------------------------------------------------------------------------------
总结:由此可知:rename 表后,相应的索引会随着表的变动同步变动。依旧是有效的。不需要我们手动修改。
我们也可以测试一下rename 表后,同义词是否有效:
1.使用scott给e1表创建一个同义词s_e.
create synonym s_e for e1;
2.查询同义词信息
SQL> select synonym_name,table_owner,table_name from user_synonyms;
SYNONYM_NAME TABLE_OWNER
------------------------------ ------------------------------
TABLE_NAME
------------------------------
S_E SCOTT
E1
3.重命名
SQL> rename e1 to e2;
Table renamed.
4.查询s_e
SQL> select synonym_name,table_owner,table_name from user_synonyms;
SYNONYM_NAME TABLE_OWNER
------------------------------ ------------------------------
TABLE_NAME
------------------------------
S_E SCOTT
E1
SQL> select * from s_e;
select * from s_e
*
ERROR at line 1:
ORA-00980: synonym translation is no longer valid
5.重新更改为e1.
SQL> rename e2 to e1;
Table renamed.
SQL> select synonym_name,table_owner,table_name from user_synonyms;
SYNONYM_NAME TABLE_OWNER
------------------------------ ------------------------------
TABLE_NAME
------------------------------
S_E SCOTT
E1
6.查询s_e
发现ok.
总结:rename表后,同义词不会同步,因此rename表后,同义词失效。
我们再测试一下rename表对视图的影响:
1.在e1表的基础上创建视图v_e1
SQL> create view v_e1 as select empno,ename,sal from e1;
View created.
SQL> select * from v_e1;
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
2.rename 表
SQL> rename e1 to e2;
Table renamed.
3.验证一下view是否可用。
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
SQL> select * from v_e1;
select * from v_e1
*
ERROR at line 1:
ORA-04063: view "SCOTT.V_E1" has errors
4.重新改为e1
SQL> rename e2 to e1;
Table renamed.
SQL> select * from v_e1;
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
5.再次验证视图的有效性
SQL> rename e2 to e1;
Table renamed.
SQL> select * from v_e1;
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
总结:rename后,view同同义词一样失效。