勿传网上!严禁谋利! Oracle学习笔记
常彦博
19.7哪些写法会导致索引用不了
1)函数导致索引用不了:where upper(colname)='carmen' 2)表达式导致索引用不了:where colname*12=12000
3)部分隐式数据类型导致索引用不了:where colname=2(c1为varchar2类型)
? 注意事项:经过计算的结果,在索引里是找不到的。只能建函数或表达式的索
引。
4)like和substr where colname like 'ca%';只要通配符不在前面,就可以用索引 where substr(colname,1,2)='ca';不可用索引 5)查询所有的null值:where colname is null 6)否定形式:not in、<> ? 注意事项:把not in转成not exist可以用索引。 eg:创建函数索引 create index test_c2_funidx on test(round(c2)); 43
勿传网上!严禁谋利! Oracle学习笔记
常彦博
二十、数据库对象:序列号sequence
面临问题:主键约束和唯一键约束要求列中每个值都必须是唯一的 程序员怎样获得唯一值:
使用Oracle提供的数据库对象sequence:序列号 程序员自己写代码实现
20.1什么是sequence
Oracle提供的数据库对象。
1)为了解决主键值和唯一键值的唯一性(即解决如果保证插入的数据是唯一的)。 2)按照预定义的模式自动生成整数的一种机制,保证数字的自动增长。 20.2创建sequence create sequence seq_name [increment by 1 | inteher] [start with integer] [maxvalue inteher | nomaxvalue] [minvalue inteher | nomaxvalue] [cycle | nocycle] (有缺省值) [cache 20(缺省值) | integer | no cache] ? 注意事项:integer一定为数值类型 eg1:创建序列号,创建sequence最简单的方式:create sequence s1 create sequence s1 start with 1 increment by 1 maxvalue 5 ? 注意事项:表、视图、索引、序列号都不能重名! eg2:若找到重名的对象 select object_type from user_object where object_name='s1';找出重名的s1是那个对象中的 drop sequence s1;发现是sequence中的s1,则删除sequence s1 20.3缺省是nocycle(不循环) eg1:不循环情况 create sequence s1 start with 1 maxvalue 5; select s1.nextval from dual; select 语句连续执行6遍,最后一次:报错 ORA-08004:sequence S110.NEXTVAL exceeds MAXVALUE and cannot be instantiated eg2:循环情况 create sequence s2 start with 1 maxvalue 5 cycle cache 4 select语句连续执行6遍,最后一次:第6次重新从1开始 20.4缺省cache 20
当没写cycle时,即为缺省值nocycle时,由于为cache 20,所以一次性取出20个数,存
44