把一个测试系统的数据从oracle 10g迁移到11g中后,听开发人员说他们有个创建索引的sql语句执行失败,但是在10g里面是能够正常执行。这个索引是一个具有重复列的函数索引,可能是手误并且这个索引没怎么用,所以就一直没注意这个索引。自己感觉挺有意思的,于是就自己试验了一下:
1、先来看11g的情况:
[oracle@instsvr1 ~]$ sql
sql*plus: release 11.2.0.2.0 production on fri mar 16 11:29:33 2012
copyright (c) 1982, 2010, oracle. all rights reserved.
connected to:
oracle database 11g enterprise edition release 11.2.0.2.0 - 64bit production
with the partitioning, automatic storage management, olap, data mining
and real application testing options
srcbdb@sys> conn vip
enter password:
connected.
非函数索引如果具有重复的列是不允许创建的:
srcbdb@vip> create index lzb on t_sys_param (param_id,param_id);
create index lzb on t_sys_param (param_id,param_id)
*
error at line 1:
ora-00957: duplicate column name
在11g里面即使是函数索引,但是具有重复的列也是不允许创建的:
srcbdb@vip> create index lzb on t_sys_param(nvl(param_name,'*'),nvl(param_name,'*'));
create index lzb on t_sys_param(nvl(param_name,'*'),nvl(param_name,'*'))
*
error at line 1:
ora-54015: duplicate column expression was specified
2、再来看10g的情况
[oracle@dctest1 ~]$ sql
sql*plus: release 10.2.0.4.0 - production on mon mar 19 19:32:20 2012
copyright (c) 1982, 2007, oracle. all rights reserved.
connected to:
oracle database 10g enterprise edition release 10.2.0.4.0 - 64bit production
with the partitioning, olap, data mining and real application testing options
dgut@sys> conn vip
enter password:
connected.
在10g里面非函数索引如果具有重复的列也是不允许创建的:
dgut@vip> create index lzb on t_sys_param (param_id,param_id);
create index lzb on t_sys_param (param_id,param_id)
*
error at line 1:
ora-00957: duplicate column name
最后来看神奇的一幕,,在10g里面如果是函数索引,即使是具有重复的列,索引依然能创建成功:
dgut@vip> create index lzb on t_sys_param(nvl(param_name,'*'),nvl(param_name,'*'));
index created.
总结:虽然创建具有重复列的函数索引没什么意义,甚至更差,但是这个11g和10g的使用差别挺有意思的就记录了下来,只能所11g更严谨了,呵呵!