约束、索引、三范式
1.约束的定义:
约束(constraint):在建表时,为某些列添加一些特定的规则,这些规则称为约束。约束是在表上强制执行的数据校验规则保证数据库的数据满足某种用户的要求。添加约束之后,再往表中(插入、更新)数据时,如果数据不满足约束,则该条语句不能执行。
2.约束的分类:
2.1 非空约束 not null
非空约束确保字段值不允许为空
非空约束只能在字段级定义
-- not null 非空约束 --添加了 not null的列的值不能为null,但可以是空格 create table test01( empno number(4) , ename varchar2(10) not null )
2.2 唯一约束 unique
唯一性约束条件确保所在的字段或者字段组合不出现重复值
唯一性约束条件的字段允许出现空值
--unique 唯一键约束 --添加了unique 约束的列的值是唯一的,不能出现重复的值,但可以有多个null值 create table test02 ( empno number(4) unique, ename varchar2(10) );
--非空且唯一 --允许同时添加not null和unique表示不能重复并且不能为null create table test03 ( empno number(4) not null unique,e name varchar2(10) );
2.3 自定义检查约束 check
check约束用于对一个属性的值加以限制。
在check中定义检查的条件表达式,在对数据进行插入或修改需要符合设置的条件。
--check 自定义检查约束 --在插入或修改数据时,值要符合check中定义的条件 create table test04( empno number(4), ename varchar2(10), age number(3) check(age>0 and age<200), gender varchar2(3) check(gender='男' or gender='女') )
2.4 主键约束 primary key
主键约束是数据库中最重要的一种约束。在关系中,主键值不可为空,也不允许出现重复,即关系要满足实体完整性规则。
– 主键从功能上看相当于非空且唯一
– 一个表中叧允许一个主键
– 主键是表中能够唯一确定一个行数据的字段
– 主键字段可以是单字段戒者是多字段的组合(联合主键)
– oracle为主键创建对应的唯一性索引
--主键约束从形式可看成类非空且唯一 create table test05( empno number(4) primary key, ename varchar2(10) )
--联合主键 --一张表只有一个主键,但可以选择多个列,作为联合主键 create table test06( empno number(4), ename varchar2(10), constraint pk_no_name primary key(empno,ename) --在列中添加约束可以不给约束命名,没有命名系统会自动命名 --在表中添加约束就需要手动命名 )
2.5 外键约束 foreign key
外键是表中的一个列,它的值依赖于另一张表的主键或者唯一键被依赖的表称为主表,
存在外键的表称为从表外键的值必须是主表(指定的)主键或者唯一键中列出
注:
对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:当要删除主表的某个主键值(依赖的,那么对依赖的影
响可采取下列3种做法:
1. restrict方式(默认,无法删除):只有当从表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。
2. cascade方式(联级删除):将从表中所有外键值与主表中要删除的主键值相对应的记录一起删除
3. set null方式(设置为空):将从表中所有与主表中被删除的主键值相对应的外键值设为空值
添加外键约束语法:
外键列 references 表名(主键列)
[on delete [cascade|set null]] 如省略on短语,默认按第一种处理方式。
--主表 create table t_dept( deptno number(2) primary key, dname varchar2(12) ) --从表 create table t_emp( empno number(4), ename varchar2(10), --添加外键,指定主键删除处理方式 deptno number(2) references t_dept(deptno) on delete set null )
3.添加和修改约束
可增加或删除约束,但不能直接修改
语法:
增加
alter table 表名 add constraint 约束名 unique(列名)
删除
alter table 表名 drop constraint 约束名 [cascade] (加了cascade就为联级删除)
4.索引
4.1 概念:
索引是为了加快对数据的搜索速度而设立的。类似于一本书的目录,数据库对表数据进行查询时可以通过索引快速定位到数据。索引是非显示的,在创建之后不会再用到,但查询数据时索引会自动起作用。
4.2 索引创建的两种情况:
1. 自动: 当在表上定义一个primary key 或者unique 约束条件时,oracle数据库自动创建一个对应的唯一索引。
2. 手动: 手动在某个或多个列上创建索引以加速查询
语法:create index index 索引名 on 表名 (列1[,列2]...);
在多个列上创建索引时,需要对多个列同时进行查询,索引才会起作用
4.3 使用索引需注意:
1. 索引提高检索操作的性能,但降低数据插入、修改和删除的性能。在执行这些操作时,dbms(数据库管理系统)必须动态地更新索引。
2.索引数据可能需要占用大量空间
3.经常出现重复的数据不适合使用索引
4.在多个列上创建索引时,需要对多个列同时进行查询,索引才会起作用
4.4 删除索引:
语法: drop index 索引名
5. 数据库设计三范式:
数据库的设计主要包含了设计表结构和表之间的联系,在设计的过程中,应该遵守三范式:
第一范式:数据库表中的每一个列都必须是不可分割的基础数据项。例如:“地址”应该拆分成省份、城市、详细地址等多个部分进行存储
第二范式:确保表中每列都与主键相关
第三范式:一个数据库表中不能包含已在其它表中已包含的非主关键字信息。