首页 > 代码库 > 约束、视图、序列、伪列和索引
约束、视图、序列、伪列和索引
前言
约束条件用于保证数据的完整性。主要有主键约束(primary key)/非空约束(not null)、唯一约束(unique) 检查约束(check)和外键约束(foreign key).
正文
约束
主键约束(primary key)
主键约束包含了非空和唯一
create table 表名(字段名 字段类型(长度) 约束条件);
1.创建自定义名称约束
create table 表名(字段名 字段类型(长度),constraint 约束名 约束类型(字段名));
注:可以通过user_constraints数据字典来查询约束。
非空约束(not null)
检查约束(check)
create table t_test(id number(10);sex char(2); constraint test_sex check (sex in(‘男‘,‘女’)));--可以通过在字段后面加 default 值,来设置默认值;在使用默认值时使用default关键字。
注:元组上的约束的定义
元组级别的限制可以设置不同属性之间取值的相互约束条件
check(ssex=‘女‘ or sname NOT like ‘MS.%‘);--当学生性别为男时,其名字不能以MS.开头。
外键约束(foreign key 字段名 references 表名(字段名)).
外键字段可以为空,或者引用自依赖的父项。
设置级联
1.赋予空值
foreign key(外键字段) references 表名(字段) on delete set null;
2.级联删除
foreign key(外键字段) references 表名(字段) on delete cascade;
联合主键
constraint pk_t_emp primary key (字段1,字段2);
DDL操作约束
alter table 表名 drop contraints 约束名称;
alter table 表名 add contraints 约束名称 约束类型(字段);
alter table 表名 modify (字段 字段类型 要添加的约束);
视图
create or replace view 视图名 as select * from emp;
注:
复杂视图的定义是,视图中的数据不能直接通过表获得,必须通过计算来获得;复杂视图的查询字段必须取别名。
序列
序列是数据库中特有的一组能够实现自动增长的数字。
create sequence 序列名 increment by 每次增长的步长 start with 起始值。
1.select 序列名.nextval from dual.--获取序列的下一个值;获取序列的当前值采用currval属性。
伪列
oracle特有的默认提供给每一个表的,以便实现某些功能。
rownum
表示每条记录的序号(查到结果集后才分配的序号),常常用于分页。
rowid
表示每条记录的唯一标识(一组32为的字符串),可用来获取记录的物理地址
例子1:删除表中的相同记录
方法一:
delete from t_table t1 where t1.rowid!=(select max(rowid) from t_table t2 where t1.id=t2.id and t.name=t2.name);;--其中 t1.id=t2.id and t.name=t2.name是定义相同记录的条件
方法二:
delete from t_table where roeid not in(select max(rowid) from t_table group by 字段一,字段二);
例子1:删除表中不重复的记录
delete from t_table t1 where t1.rowid=(select max(rowid) from t_table t2 where t1.id=t2.id and t.name=t2.name) and t1.rowid=(select min(rowid) from t_table t2 where t1.id=t2.id and t.name=t2.name) ;
应用于分页
1.三目运算来计算总页数 totalpage=sum/pagesize+sum%pagesize==0?0:1;//计算总页数,sum为总记录数
2.第page页的记录的起始位置和结束位置分别为:
pagesize*(page-1)+1;起始位置
pagesize*page;j、结束位置
注:
1.可以使用差集(minus)在数据库查询中实现分页,但效率低‘
2.常用子查询将rownum作为另一结果集的字段来实现分页。
select ee.* from(select e.* , rownum rr from (select * from emp where sal is not null order by sal ) e )ee where ee.rr berween &start and &end;
3.rownum的分页地java代码示例
索引
快速的查找定位到某条记录(底层采用rowid来实现);没有索引查找时,将采用全表扫描(full table scan)
注:
1.查找索引可以使用user_indexes数据字典。
2数据库.默认为表中的主键和唯一键建立索引。
自定义索引
create index 索引名 on 表名(字段名);
不应该应用索引的情况
1.经常进行更新操作的字段
2.表小,查询结果集大
3.不常用的字段
应用索引的情况
1.经常用来查询的字段
2.当表的数据量很大且查询的结果集较小
3.当前字段值很多为空的字段
4.经常用来作为联合查询的字段
5.外键字段
数据字典
存储描述对象(表,序列、视图、触发器、过程、函数等)信息的表或视图称为数据字典。
user_XXX 表示当前用户的相关信息的数据字典
user_tables/user_constraints/user_indexes/user_sequences/user_views/user_objects
例如:select distinct object——type from user_objects;--查看所有的对象