Oracle基础(八):约束、索引、序列
2015-06-02 21:40
609 查看
一、约束
(一)数据的完整性
1、维护数据的完整性有三个方法,分别是约束、触发器、应用程序(存储过程,函数)
(二)约束
1、非空:not null
1)说明:用于指定某列的值,不能为空
2)实例
2、唯一:unique
1)说明:用于指定某列的值,不能重复,但是可以为null
2)实例
3)注意:
unique 可以为空,并且可以多个 null;
3、主键:primary key
1)说明:用于唯一的标示表行的数据,当定义主键约束后,该列不但不能重复,而且不能为空。
2)实例
3)注意:与unique的区别
一个表可以有多个unique,但是只能有一个主键
每张表都应该有一个主键,但是可以没有unique。
unique的值可以为空,但是主键不可以
主键会自动建索引,但是unique不会(好像也会,再查一下)。
4、外键:foreign key-references
1)说明:用于定义主表和从表之间的关系,外键约束定义在从表(有外键列)上。
2)实例
3)注意
外键只能指向主键列或者unique列
先建主表,再建从表;删除表的时候,先删除从表,再删除主表。
外键列与主键列的数据类型要一致,长度无关。
外键列的值,必须在主键列中存在或者为空。
5、检测:check
1)说明:用于强制行数据必须满足的条件,假定在 sal 列上定义了check 约束,并要求 sal 列值在1000~2000之间。如果不在这之间就是提示出错
2)实例:
6、默认:default
1 )练习,建3张表:
7、修改约束
1)alter table 命令为表增加约束,但是注意,增加not null 约束需要使用modify ;而其他的四种约束使用add
2)实例
修改 非空not null 约束
增加唯一约束
u_Id : 约束的名字
增加check 约束
goods_name :约束的名字。
8、删除约束
1)语法:
删除约束的时候,需要带上约束名。
2)删除主键:
有主从关系,需要级联删除
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)实例
2、注意
1)在大表上建索引才有意义
2)在 where 子句或者是连接条件上经常引用的列上建立索引
3)索引的层次不要超过 4 层。
(三)索引的缺点
1、缺点:
1)占用内存。建立索引,系统要占用为表的1.2倍的硬盘和内存空间来保存索引。
2)更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维护数据和索引的一致性。
3)不恰当的索引会降低性能。大量索引在插入、修改和删除操作时比没有索引花费更多的系统时间。
2、不恰当案例
1)很少或从不引用的字段
2)逻辑性的字段,如男或女(是与否)等。
3、对索引字段使用 oracle函数(sum,max等),会破坏索引本身的效率。
(一)数据的完整性
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等),会破坏索引本身的效率。
相关文章推荐
- Oracle基础(七):数据库事务
- Oracle基础(六):Oracle 函数
- oracle用户密码过期的处理方法
- Sybase查询表结构的方法(类似于Oracle的Desc)
- Oracle基础(五):多表查询
- oracle rac IO 隔离的存储SCSI锁原理
- windows 10 install oracle 12c error:[ INS-30131 ]
- Oracle存储过程update受外键约束的主键值时完整性冲突解决方案
- Oracle基础(no.1)
- ubuntu 安装oracle-jdk7
- Oracle、MySql、SQLServer 数据分页查询
- 通过Rman catalog 创建及管理Oracle数据库备份
- Oracle Study之-- enq:SQ contention等待事件
- Oracle误删除表数据后的恢复详解
- oracle创建dblink
- Oracle学习(11):PLSQL程序设计
- Oracle11g EXP ORA-01455
- Oracle Big Data Appliance
- Oracle Study之-- enq:SQ contention等待事件
- 实现c# 直接连接Oracle数据库操作,不用安装各种插件