目录
一、基础知识
1、Data Integrity 数据库的完整性
2、Types of Constraints 约束类型
3、Constraint States 约束状态
4、Guidelines for Constraints 约束准则
二、基础操作
1、Enabling Constraints 启用约束
2、命令方式创建约束
3、修改表创建的约束
4、删除约束
5、列级定义
6、表级定义
Maintaining Data Integrity 维护数据完整性
目标:
- 实现数据完整性约束
- 维护完整性约束
- 获取约束信息
一、基础知识
1、Data Integrity 数据库的完整性
2、Types of Constraints 约束类型
- NOT NULL:非空约束(表级和列级)
- UNIQUE:唯一约束(一列或者多列的组合是唯一的)
- PRIMARY KEY:主键约束(同时包含非空约束和唯一约束)
- FOREIGN KEY:外键约束
- CHECK:限制约束(比如约束id必须大于0,性别只能为男女之类的)
3、Constraint States 约束状态
以下是最佳切换步骤(unique约束会让这四种状态切换存在问题,切换前要先变成nounique状态):
- DISABLE NOVALIDATE:稍后执行约束,不检查之前存在的数据
- DISABLE VALIDATE:稍后执行约束,检查之前存在的数据,此时就等于只读模式
- ENABLE NOVALIDATE:立刻执行约束,不检查之前存在的数据
- ENABLE VALIDATE:立刻执行约束,并且检查之前存在的数据
完整性约束的有效使用:一个程序
按照以下顺序使用完整性约束状态可以确保获得最佳收益:
- 1.禁用状态。
- 2.执行操作(加载、导出、导入)。
- 3.启用novalidate状态。
- 4.启用状态。
按此顺序使用约束的一些好处是:
- 没有锁。
- 所有约束都可以同时进入启用状态。
- 约束启用是并行完成的。
- 允许在表上进行并发活动
4、Guidelines for Constraints 约束准则
- 主键约束和唯一约束
- 将索引放在单独的表空间中
- 如果批量加载频繁,请使用非唯一索引。
- 自引用外键
- 在初始加载后定义或启用外键。
- 延迟约束检查。
二、基础操作
1、Enabling Constraints 启用约束
- 表上没有锁
- 主键和唯一键需要使用非唯一索引
ALTER TABLE hr.departments
ENABLE NOVALIDATE CONSTRAINT dept_pk;
2、命令方式创建约束
这里以check约束为例
CREATE TABLE <表名>
( <列名> <数据类型> [DEFAULT <默认值>] [NOT NULL | NULL][CONSTRAINT <约束名>] 约束方式 /*定义为列的约束*/[,…n][CONSTRAINT <约束名>] 约束方式 /*定义为表的约束*/
)
例如:创建一个表demo,并且为该表的属性score创建一个check约束条件。
create table demo(sid VARCHAR(20) NOT NULL ,sname VARCHAR(20) NOT NULL,profession VARCHAR(20) NOT NULL,score NUMBER(4) check(score>60 and score<80) NOT NULL );
3、修改表创建的约束
ALTER TABLE <表名>ADD CONSTRAINT <约束名> <约束种类>
4、删除约束
ALTER TABLE <表名>DROP CONSTRAINT <约束名称>
5、列级定义
- 列级定义是在定义列的同时定义约束。
- 特别注意:not null只能在列级定义,不可在表级定义中出现。
示例:
create table temp1
( id number primary key,
name varchar2(32) not null
);
6、表级定义
- 表级定义是在定义了所有列后,再定义约束。
- 基本语法:
- create table 表名(字段名 字段类型,...,constraint 约束名称 约束条件(字段),约束条件(字段2),..);
示例:
create table temp2
( id number,
name varchar(32),
constraint pr_id primary key(id), unique(name)
);
语法:
constraint 约束名称 primary key(字段..)
constraint 约束名称 foreign key(字段) references 主表(字段)
constraint 约束名称 unique(字段)
constraint 约束名称 check(字段条件)
一般情况下,使用列级定义即可。但是如果遇到定义复合主键(两列一起被定义为主键)时,需要用到表级定义。
举例,将id与name定义为复合主键:
create table temp3 (id number, name varchar2(64), nums number, constraint pk_id_name primary key(id,name) );