“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情”
引言
约束条件用于保证数据的完整性。 主要有主键约束(primary key)/非空约束(not null)、唯一约束(unique) 检查约束(check)和外键约束(foreign key)。
I 约束
1.1 主键约束(primary key)
主键约束包含了非空和唯一
create table 表名(字段名 字段类型(长度) 约束条件);
创建自定义名称约束
create table 表名(字段名 字段类型(长度),constraint 约束名 约束类型(字段名));
注:可以通过user_constraints数据字典来查询约束。
联合主键
constraint pk_t_emp primary key (字段1,字段2);
1.2 非空约束(not null)
1.3 检查约束(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.开头。
1.4 外键约束
foreign key 字段名 references 表名(字段名)
外键字段可以为空,或者引用自依赖的父项。
设置级联
- 赋予空值
foreign key(外键字段) references 表名(字段) on delete set null;
- 级联删除
foreign key(外键字段) references 表名(字段) on delete cascade;
1.5 DDL操作约束
alter table 表名 drop contraints 约束名称;
alter table 表名 add contraints 约束名称 约束类型(字段);
alter table 表名 modify (字段 字段类型 要添加的约束);
II 索引
快速的查找定位到某条记录(底层采用rowid来实现),没有索引查找时,将采用全表扫描(full table scan)。
索引的原理:对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找快速找到要查找的行的地址,再根据地址直接取行数据。
-
查找索引可以使用user_indexes数据字典。
-
数据库默认为表中的主键和唯一键建立索引。
2.1 自定义索引
create index 索引名 on 表名(字段名);
- 不应该应用索引的情况:
-
经常进行更新操作的字段
-
表小,查询结果集大
-
不常用的字段
- 应用索引的情况:
-
经常用来查询的字段
-
当表的数据量很大且查询的结果集较小
-
当前字段值很多为空的字段
-
经常用来作为联合查询的字段
-
外键字段
2.2 索引操作法则
-
避免对索引字段进行计算操作
-
避免在索引字段上使用
not、<、>、和!= -
避免在索引列上使用
is null和is not null。 -
避免在索引列上出现数据类型转换
-
避免在索引字段上使用函数
-
避免在建立索引的列中使用空值.
2.3 对索引的认识
索引的结构、对dml的影响、对查询的影响和为什么提高查询性能?
-
索引有b-tree和cluster等类型。oracle使用了一个复杂的自平衡b-tree结构;
-
通常来说在表上建立适当的索引,在查询时会改进查询性能。
-
但在进行插入、修改和删除是,同时会进行索引的修改,在性能上有一定的影响。索引通常能够提高select、update和delete的性能,但会降低insert的速度。
-
有索引且在查询条件使用索引时,数据库会先读取索引,再根据索引内容和查询条件来查询出rowid,最后根据rowid取出需要的数据。由于索引内容通常比全表内容要少很多,因此通过先读索引能够减少I/O,提高查询性能。
III 数据字典
存储描述对象(表,序列、视图、触发器、过程、函数等)信息的表或视图称为数据字典。
user_XXX表示当前用户的相关信息的数据字典
user_tables/user_constraints/user_indexes/user_sequences/user_views/user_objects
user_all_XXX当前用户所能访问的对象的数据字典dba_xxx当前数据库下得所有对象的数据字典