oracle数据库中表的创建及管理--约束

约束—插入数据时对条件进行过滤

表建立完成后,并不能检查表中的数据是否合法,如果想要针对表中的数据做一些过滤的话,则可以通过约束完成,约束的主要功能是保证表中的数据合法性,按照约束的分类,一共有五种约束:
非空约束
唯一约束
主键约束
检查约束
外键约束

非空约束/NOT NULL/NK

SQL> create table haha(
2 mid number,
3 name varchar2(20) not null);
插入数据:
SQL> insert into haha(mid,name) values(1,‘zhangsan’);
SQL> insert into haha(mid,name) values(1,‘zhangsan’);
SQL> insert into haha(mid,name) values(3,‘lala’);
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
当插入name为空的错误数据时:
SQL> insert into haha(mid) values(5);
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:

唯一约束/UNIQUE/UK

创建唯一约束的表
SQL> create table huhu(
2 mid number,
3 name varchar2(20) not null,
4 email varchar2(20) unique);
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入正确数据
SQL> insert into huhu(mid,name,email) values (1,‘xixi’,‘[email protected]’);
SQL> insert into huhu(mid,name,email) values (2,‘kiki’,‘[email protected]’);
插入错误的email重复数据
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
为了使错误提示更加明确
添加约束:
SQL> create table huhu(
2 mid number,
3 name varchar2(20),
4 email varchar2(20),
5 constraint uk_email unique(email));
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入错误数据:
SQL> insert into huhu(mid,name,email) values (2,‘kiki’,‘[email protected]’)
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:

主键约束/PRIMARY KEY/PK

SQL> create table huhu(
2 mid number primary key,
3 name varchar2(20) not null);
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入正确的数据:
SQL> insert into huhu(mid,name) values(1,‘lisi’);
插入主键为空的错误数据:
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入主键重复的数据:
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
添加约束,使错误提示更明确
SQL> create table huhu(
2 mid number,
3 name varchar2(20) not null,
4 constraint pk_mid primary key (mid));
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
输入主键重复的错误数据:
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
#创建复合主键
SQL> create table huhu(
2 mid number,
3 name varchar2(20) not null,
4 constraint pk_mid_name primary key (mid,name));
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入正确数据:
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入复合主键重复数据–只有当复合主键的所有字段都重复是才算重复
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:

检查约束/CHECK/CK

SQL> create table huhu(
2 mid number,
3 name varchar2(20) not null,
4 sex varchar2(20) not null,
5 age number(3),
6 constraint pk_mid primary key (mid),
7 constraint ck_sex check (sex in (‘nan’,‘nv’,‘qita’)),
8 constraint ck_age check (age between 0 and 100));
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入超出检查约束年龄限制的数据;
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入错误数据 性别
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:

外键约束#–

创建两张表------mid字段将两张表相关联
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入数据
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
#统计每个人拥有书的数量
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
#查询出每个人的编号,姓名和用户有书的名称
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
此时若在向表中插入mid=3/4、、、不在父表xixi表mid范围内的数据,依然可以直接插入而不报错,这样就造成了数据污染
因此重新创建两张表并添加外键约束:
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入数据:
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
输入错误数据:
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
因为member.mid没有指定的3和9数据,所以book.mid如果数据有错误,则无法执行更新操作,实现了让book.mid的字段的取值由member.mid所决定,如果member.mid的数据真实存在,则表示为正常数据,可以更新
1、外键约束导致删除表时,只能先删除字表中的数据才能删除父表中的数据
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
使用级联删除的功能
修改数据库创建脚本;
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入数据;
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
此时再删除父表中的数据
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
此时发现子表中的数据信息也全没有了
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
2、此时由于存在级联删除的操作,所以主表中的数据删除之后,对应的子表中的数据也都会被同时删除。
当主表中的数据删除后,对应的子表中的数据相关项希望设置为null,而不是删除。可以继续修改数据库的创建脚本:
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
插入数据
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
#再次执行删除操作
DELETE FROM MEMBER WHERE MID=1;
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点:
此时显示为空,而非无数据
3、删除表时也只能先删除字表,再删除父表
解决办法:
#强制删除表,不再关心约束
DROP TABLE MEMBER CASCADE CONSTRAINT PURGE;
但是子表book还在
在超文本传输协议http+ssl认证---超文本传输安全协议--应用层与传输层之间加Ssl建立在tcp之上,三个特点: 所以:更好的做法: 在以后进行数据表删除的时候,最好是先删除子表,再删除父表