Chinaunix首页 | 论坛 | 博客
  • 博客访问: 81314
  • 博文数量: 65
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-30 11:16
个人简介

cuug

文章分类
文章存档

2014年(65)

我的朋友

分类: Oracle

2014-05-22 10:32:34

把一个测试系统的数据从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更严谨了,呵呵!
阅读(506) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~