现在的位置: 首页 > 综合 > 正文

第九课 oracle数据约束,索引等

2013年11月12日 ⁄ 综合 ⁄ 共 2721字 ⁄ 字号 评论关闭

在建立和修改表时,必须依照一定的规则,要遵循数据的约束,注意运用索引,触发器,函数等,这样才能使数据库完整,操作数据库高效。

Oracle中,这些规则包括约束,触发器,应用程序(过程,函数)三种方法来实现,其中约束最为有效,为首选。

1,  约束:

约束包括not null,unique,primary key, foreign key,check 五种;

  Oracle中当定义该字段为unique后,一般会为他设置一个索引。

  定义为primary key 后,该列不能为null也不能重复;一张表只能有一个primarykey 但可以有多个unique;

Foreign key一般定义在从表上,该列数据必须在主键列存在或者为空;主表必须具备主键约束或者unique约束。

案例分析:

建立3张表:在建表的实例中看是怎么定义这些约束的:

1,goods表:

create table goods(goodsid char(8) primary key,

goodsname varchar2(30),

unitprice number(10,2) check(unitprice>0),

category varchar2(30));

1,  customer表:

create tablecustomer(customerid char(8) primary key,

    name varchar2(50) not null,

   address varchar2(50),

email varchar2(30),

sex char(2) default’’ check (sex in(‘’,’’));

cardid char(18));

2,  purchase表:

  createtable purchase(customerid char(8) references customer(customerid),

goodsid char(8) references goods(goodsid),-------------------------这里相当于定义了一个外键

nums number(10) check(nums between 1and 30));

增加,修改约束:

在创建表后,可以通过alter table 增加约束(注意,增加nut null约束时,需要使用modify选项,其他约束使用add):

alter table customer modify name notnull
修改约束  客户名为非空,注意为modify;

alter table customer add constraintcarduni  unique(customerid)  :使得customer约束唯一,注意形式,add
carduin(
这个只是约束名) ;

 alter table customer add constraint addresscheck check(address in('beijing','haiding')); :使得地址只能为两个地方;

alter table customer add constraintaddresscheck check (sex in('',''),default
’);

删除约束:

Alter tablecustomer drop constranint 约束名  cascade;cascade表示删除与另外表的联系,如外键等

查询约束信息:

1,  显示约束信息:通过数据字典user_constraints,可以显示当前用户的所有的约束的信息:

   selectconstraint_name,constraint_type,status,validated from

  user_constraints where table_name='CUSTOMER';

2,  显示约束列;数据字典: user_cons_columns  可以显示约束所对应的表列信息:

Selectcolumn_name,position from user_cons_columns where constraint_name=’约束名字’;

3,当然可以直接用pl/sql developer查看即可;


定义约束的两种方式:

定义约束可以有列级定义和表级定义,大同小异:

列级定义:Create table depar (dept_id numer(2) constraint pk_depar primary key,

Namevchar2(12),

Locvarchar2(12));

表级定义:create table empl(empidnumber(4),name varchar2(15),dept_id number(2))

constraint pk_empl primary key (empid),constraint fk_deparforeign(dept_id) reference depar(dept_id));

表级定义是指定义了所有列后,在定义约束。但是not null约束只能定义在列级约束上);

索引:

 

索引一般是建立在海量数据上的,用于加速数据存取的数据对象。合理的使用索引可以大大降低i/o次数,从而提高数据访问性能。

1,  单列索引:基于单个列所建立的索引,比如:create index 索引名 on 表名(列名);

2,  复合索引:基于多列。  如: create index emp_idex on emp(ename,job); create index emp_idex onemp(job,ename);

同一张表可以建立多个索引。

创建索引原则:

1,在大表上建立索引才有意义;

2,在where子句或者连接条件上经常引用的列上建立索引;

3,索引的层次不要草果4层;

索引的缺点:

1,建立索引,系统要占用大约为表的1.2倍的硬盘和内存来保存索引;

2,更新数据时,系统必须要额外的时间来同时对索引进行更新,以维持数据和索引的一致性;

所以要恰当的使用索引;

索引分类:

按照数据存储方式,可以分为B*树,反向,位图索引;

按照索引列个数分,可以分为单列,符合索引;

按照索引列值分为,唯一和非唯一索引;

此外还有函数索引,全局索引,分区索引等;

查询索引:

通过数据字典dba_index(数据库所有索引) 和user_indexs (当前用户索引);

如:查询当前表的索引:selectindex_name,index_type from user_indexes where table_name='EMP’;

显示索引列:数据字典:user_ind_columns:
selecttable_name,column_name from user_ind_columns where index_name='IND_ENAME';


对于索引,我觉得对于我等菜鸟,在没搞清楚时,还是少用,所以略过;

【上篇】
【下篇】

抱歉!评论已关闭.