在建立和修改表时,必须依照一定的规则,要遵循数据的约束,注意运用索引,触发器,函数等,这样才能使数据库完整,操作数据库高效。
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';
对于索引,我觉得对于我等菜鸟,在没搞清楚时,还是少用,所以略过;