13_约束constraint
一、什么是约束
有以下五种约束:
- NOT NULL 非空约束
- UNIQUE 唯一约束
- PRIMARY KEY 主键约束
- FOREIGN KEY 外键约束
- CHECK 检查约束
注意事项
- 如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名
- 创建和修改约束:
建表的同时
建表之后 - 可以在表级或列级定义约束
- 可以通过数据字典视图查看约束
二、表级约束和列级约束
- 作用范围:
①列级约束只能作用在一个列上
②表级约束可以作用在多个列上(当然表级约束也可以作用在一个列上) - 定义方式: 列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。
- 非空(not null) 约束只能定义在列上
三、定义约束
CREATE TABLE employees(
employee_id NUMBER(6),
first_name VARCHAR2(20),
...
job_id VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk
PRIMARY KEY (EMPLOYEE_ID));
1.NOT NULL 约束(非空约束)
保证列值不能为空: 只能定义在列上
--在创建表的同时 为表中的列条件非空约束
create table STUDENT
(
stu_id NUMBER not null,
stu_name VARCHAR2(50) CONSTRAINT stu_name_null not null,
stu_age NUMBER,
stu_sex VARCHAR2(10),
cls_id NUMBER
)
2.UNIQUE 约束 (唯一约束)
添加了唯一约束的列中的值不允许重复
--在创建表的同时 为表中的列条件非空约束
create table STUDENT
(
stu_id NUMBER not null,
stu_name VARCHAR2(50) UNIQUE --唯一约束 ,
stu_age NUMBER,
stu_sex VARCHAR2(10),
cls_id NUMBER
)
唯一约束,允许出现多个空值:NULL。
3.PRIMARY KEY 约束(主键约束)
主键约束 = 非空约束 + 唯一约束
在主键列的定义上 采用数据值唯一的列来作为主键列 一般在数据表定义的时候 都会定义一个冗余的无意义的列来作为主键列
如果采用有意义的列 不能保证该列永远满足唯一约束
create table STUDENT
(
stu_id NUMBER not null,
stu_name VARCHAR2(50) UNIQUE, --唯一约束 ,
stu_age NUMBER,
stu_sex VARCHAR2(10),
cls_id NUMBER,
constraint pk_stu_id primary key(stu_id)--主键约束
)
create table STUDENT
(
stu_id NUMBER not null,
stu_name VARCHAR2(50) UNIQUE, --唯一约束 ,
stu_age NUMBER,
stu_sex VARCHAR2(10),
cls_id NUMBER,
constraint pk_stu_id_name primary key(stu_id,stu_name)--主键约束 联合主键
)
4.FOREIGN KEY 约束(外键约束)
表与表之间的关系: 一对一 一对多 多对一 多对多
一对一:一夫一妻制
一对多/多对一:员工和部门之间管
多对多:订单和商品 用户和权限
关系的维护:
一对一的关系维护可以在任意一方来维护
一对多/多对一 往往一方来维护
多对多:需要借助与第三张表 来维护这种关系
表的设计:以一对多为例:在一方的表中 设计一个冗余字段 来保存自己与多方的关系
employees中有一个department_id
为了保证在插入数据的时候 不至于出现非法数据 所以在建表的时候 就会为表来指定外键约束
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCES departments(department_id),
1.FOREIGN KEY 约束的关键字
- FOREIGN KEY: 在表级指定子表中的列
- REFERENCES: 标示在父表中的列
在添加外键约束的时候 对于所关联的表中的字段(class表中的cls_id) 该字段必须是主键列或者有唯一约束
create table STUDENT
(
stu_id NUMBER not null,
stu_name VARCHAR2(50) not null,
stu_age NUMBER,
stu_sex VARCHAR2(10),
cls_id NUMBER,
CONSTRAINT stu_cls_fk FOREIGN KEY(cls_id)
REFERENCES class(cls_id)--外键约束
);
对于外键约束中
关联的表为主表(class) 维护关系的表称为从表(student)
删除从表数据 不会对主表数据产生影响 可以直接删除
删除主表数据 会对从表数据产生影响 必须指定删除的策略 删除主表数据时 对从表数据的一个处理方式:
- ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
- ON DELETE SET NULL(级联置空/级联更新): 子表中相应的列置空
create table STUDENT
(
stu_id NUMBER not null,
stu_name VARCHAR2(50) not null,
stu_age NUMBER,
stu_sex VARCHAR2(10),
cls_id NUMBER,
CONSTRAINT stu_cls_fk FOREIGN KEY(cls_id)
REFERENCES class(cls_id) on delete CASCADE--外键约束 同时设置删除策略为级联删除
);
delete from class where cls_id = 1;
create table STUDENT
(
stu_id NUMBER not null,
stu_name VARCHAR2(50) not null,
stu_age NUMBER,
stu_sex VARCHAR2(10),
cls_id NUMBER,
CONSTRAINT stu_cls_fk FOREIGN KEY(cls_id)
REFERENCES class(cls_id) on delete set null--外键约束 同时设置删除策略为级联置空
);
5.CHECK 约束
定义每一行必须满足的条件
create table STUDENT
(
stu_id NUMBER not null,
stu_name VARCHAR2(50) not null,
stu_age NUMBER,
stu_sex VARCHAR2(10) ,
cls_id NUMBER,
CONSTRAINT stu_cls_fk FOREIGN KEY(cls_id)
REFERENCES class(cls_id) on delete set null,--外键约束 同时设置删除策略为级联置空
CONSTRAINT stu_sex_ck check (stu_sex in('男','女'))
);
create table STUDENT
(
stu_id NUMBER not null,
stu_name VARCHAR2(50) not null,
stu_age NUMBER,
stu_sex VARCHAR2(10) ,
cls_id NUMBER,
CONSTRAINT stu_cls_fk FOREIGN KEY(cls_id)
REFERENCES class(cls_id) on delete set null,--外键约束 同时设置删除策略为级联置空
CONSTRAINT stu_sex_ck check (stu_sex in('男','女')),--检查约束
constraint stu_age_ck check(stu_age >18 and stu_age < 50)--设置年龄的范围为18-50岁
);
四、添加约束的语法
使用 ALTER TABLE 语句:
- 添加或删除约束,但是不能修改约束
- 有效化或无效化约束
- 添加 NOT NULL 约束要使用 MODIFY 语句
ALTER TABLE table ADD [CONSTRAINT constraint] type (column);
--给student 表添加检查约束
alter table student add constraint stu_age_ck check (stu_age > 18);
以create table emp as select * from employees;为例,添加和删除约束
Alter table emp modify(empname varchar2(50) not null);
--添加非空约束
alter table student modify (stu_name varchar2(100) not null);
五、删除约束
删除时该约束必须存在
--删除约束
alter table student drop constraint stu_sex_ck;
六、无效化约束
在ALTER TABLE 语句中使用 DISABLE 子句将约束无效化
--无效化约束
alter table student disable constraint stu_sex_ck;
七、激活约束
ENABLE 子句可将当前无效的约束激活
--激活约束
alter table student enable constraint stu_sex_ck;
当定义或激活UNIQUE 或 PRIMARY KEY 约束时系统会自动创建UNIQUE 或 PRIMARY KEY索引
八、查询约束
查询数据字典视图 USER_CONSTRAINTS
--查询约束 注意过滤条件中的表名要大写
select * from user_constraints where table_name='STUDENT';
九、查询定义约束的列
查询数据字典视图 USER_CONS_COLUMNS
--查询定义约束的列
select * from user_cons_columns where table_name='STUDENT';
总 结
通过本章学习,您已经学会如何创建约束描述约束的类型:
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK