您的位置:首页 > 数据库 > Oracle

Oracle基础(八):约束、索引、序列

2015-06-02 21:40 609 查看
一、约束
(一)数据的完整性
1、维护数据的完整性有三个方法,分别是约束、触发器、应用程序(存储过程,函数)

(二)约束
1、非空:not null
1)说明:用于指定某列的值,不能为空
2)实例
create table user1(  id number NOT NULL,  name varchar2(32) not null )


2、唯一:unique
1)说明:用于指定某列的值,不能重复,但是可以为null

2)实例

create table user1(  id number unique,  name varchar2(32) not null )

3)注意:

unique 可以为空,并且可以多个 null;

3、主键:primary key

1)说明:用于唯一的标示表行的数据,当定义主键约束后,该列不但不能重复,而且不能为空。

2)实例

create table user1(  id number primary key,  name varchar2(32) not null )


3)注意:与unique的区别

一个表可以有多个unique,但是只能有一个主键
每张表都应该有一个主键,但是可以没有unique。
unique的值可以为空,但是主键不可以
主键会自动建索引,但是unique不会(好像也会,再查一下)。

4、外键:foreign key-references

1)说明:用于定义主表和从表之间的关系,外键约束定义在从表(有外键列)上。
2)实例

create table class(id number primary key , name varchar2(32))
create table stu(  id number primary key,  class_id number  references class(id))


3)注意

外键只能指向主键列或者unique列
先建主表,再建从表;删除表的时候,先删除从表,再删除主表。
外键列与主键列的数据类型要一致,长度无关。
外键列的值,必须在主键列中存在或者为空。

5、检测:check

1)说明:用于强制行数据必须满足的条件,假定在 sal 列上定义了check 约束,并要求 sal 列值在1000~2000之间。如果不在这之间就是提示出错
2)实例:

create table user4( id number primary key,  name varchar2(32) not null ,   sal number check(sal>=1000 and sal <=2000) );
sex char(2) check(rex in ('男','女') )


6、默认:default
1 )练习,建3张表:
create table dev_goods( goodsId number primary key, goodsName varchar2(32), unitprice number check(unitprice >0 ) ) 
create table dev_customer( customerId number primary key,  name varchar2(32) not null, sex char(2) default '男' check(sex in ('男','女')),  email varchar2(32) unique )
default 应该放在前面
create table dev_purchase( customerId number references dev_customer(customerId),  goodsId number references dev_goods(goodsId),  nums number  )


7、修改约束
1)alter table 命令为表增加约束,但是注意,增加not null 约束需要使用modify ;而其他的四种约束使用add
2)实例

修改 非空not null 约束

ALTER TABLE dev_goods MODIFY(goodsName not null);
alter table dev_goods add (goodsDate date default date '2012-07-25' not null);


增加唯一约束

ALTER TABLE dev_goods add constraint   u_Id  unique(goodsName )


u_Id : 约束的名字

增加check 约束

ALTER TABLE dev_goods add constraint   goods_name check(goodsName in('a','b','c')  )


goods_name :约束的名字。

8、删除约束
1)语法:
alter table dev_goods  drop constraint  goods_name(约束名称)。


删除约束的时候,需要带上约束名。

2)删除主键:

alter table dev_goods  drop primary key 【cascade】


有主从关系,需要级联删除

9、约束的定义
1)列级定义

建表的时候,直接在列后定义约束,称为列级定义。

比如 create table user(id number primary key)

2)表级定义

把每个列都定义完毕后,在分别说明约束。

比如 create table user(user_id number , constraint pk_id primary key(user_id ))
表级定义 ,建议每个约束都需要有名字。

联合主键的情况,就一定需要表级定义。

create table user(user_id number , user_name varchar2(32), constraint pk_id_name primary key(user_id,user_name ))
联合主键



二、序列 sequence
(一)概述
1、oracle,通过序列来处理自动增长列
1)可以为表中的列自动产生值
2)由用户创建数据库对象,并可由多个用户共享
3)一般用于主键或唯一列

2、其他数据库中自增长:
1)sql server

identity (1,1)

2)mySQL

auto_incrment

(二)语法
1、完整实例



2、使用:
1)currval:当前序列
2)nextval:下一个序列

select my_seq.currval from
dual;
select my_seq.nextval from
dual;
序列的名字 + 关键字

3)创建好序列后,必须先nextval 才能使用currval
3、删除:

drop sequence my_seq;

三、索引 index

(一)概述
1、目的:提高效率



2、分类
1)单列索引
2)复合索引

(二)语法
1、创建索引
1)语法:

create index 索引名 on 表名 (列1,列2...);
单列索引就一列,复合索引就多列

2)实例
create index stu_index_id on DEV_STUDENT(ID);


2、注意
1)在大表上建索引才有意义
2)在 where 子句或者是连接条件上经常引用的列上建立索引
3)索引的层次不要超过 4 层。

(三)索引的缺点
1、缺点:
1)占用内存。建立索引,系统要占用为表的1.2倍的硬盘和内存空间来保存索引。
2)更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维护数据和索引的一致性。
3)不恰当的索引会降低性能。大量索引在插入、修改和删除操作时比没有索引花费更多的系统时间。

2、不恰当案例
1)很少或从不引用的字段
2)逻辑性的字段,如男或女(是与否)等。

3、对索引字段使用 oracle函数(sum,max等),会破坏索引本身的效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: