异常或者错误数据进入系统会对系统运行的稳定性产生重大影响,本节将阐述如何保证进入数据库的数据是符合要求的,即表的约束。
1 系统、环境和前提约束
- win10 64
- oracle 11g https://www.jianshu.com/p/1609289f4c5f
2 操作
-
1 以系统管理员启动cmd命令行
- 2 约束有5类,分别是非空、唯一、检查、主键、外键
- 2.1 非空
执行以下命令:
# 在windows命令行下连接scott
sqlplus scott/tiger
# 创建之前先删除、确保创建成功
drop table t_user;
# 创建一张表,name不能为空
create table t_user(id int, name varchar(20) not null);
# 测试1
insert into t_user(id) values(1); --报错
insert into t_user(id,name) values(2,'wanhe'); --正确
# 在创建表之后加入非空约束
drop table t_user;
create table t_user(id int, name varchar(20));
alter table t_user modify name constraint t_user_nn not null;
# 测试2
insert into t_user(id) values(1); --报错
insert into t_user(id,name) values(2,'wanhe'); --正确
# 删除约束
alter table t_user drop constraint t_user_nn;
# 测试3
insert into t_user(id) values(1); --正确
- 2.2 唯一
执行以下命令:
# 创建之前先删除、确保创建成功
drop table t_user;
# 创建一张表,name值要唯一
create table t_user(id int,name varchar(20) unique);
# 测试1
insert into t_user(id,name) values(1,'wanhe');--正确
insert into t_user(id,name) values(1,'wanhe');--错误,wanhe已经存在
# 在创建表之后加入唯一约束
drop table t_user;
create table t_user(id int,name varchar(20));
alter table t_user add constraint nn unique(name);
# 测试2
insert into t_user(id,name) values(1,'wanhe');--正确
insert into t_user(id,name) values(1,'wanhe');--错误,wanhe已经存在
# 删除约束
alter table t_user drop constraint nn ;
# 测试3
insert into t_user(id,name) values(1,'wanhe');--正确
insert into t_user(id,name) values(1,'wanhe');--正确
- 2.3 检查【值必须在某个范围以内】
执行以下命令:
# 创建之前先删除、确保创建成功
drop table t_user;
create table t_user(id int,name varchar(20),age int check(age>18));
# 测试1
insert into t_user values(1,'wanhe',25);--正确
insert into t_user values(2,'xiaoli',2) --错误
# 在创建表之后加入check约束
drop table t_user;
create table t_user(id int,name varchar(20),age int);
alter table t_user modify (age int check(age>18));
# 测试2
insert into t_user values(1,'wanhe',25);--正确
insert into t_user values(2,'xiaoli',2) --错误
- 2.4 主键【非空唯一索引】
执行以下命令:
# 创建之前先删除、确保创建成功
drop table t_user;
create table t_user(id int primary key,name varchar(20);
# 测试1
insert into t_user(id,name) values(1,'ali'); --正确
insert into t_user(id,name) values(2,'ali'); --正确
insert into t_user(name) values('ali'); --错误,主键为空
insert into t_user(id,name) values(2,'ali'); --错误,主键重复
# 在创建表之后加入主键约束
drop table t_user;
create table t_user(id int, name varchar(20);
alter table t_user add constraint pk primary key(id);
# 测试2
insert into t_user(id,name) values(1,'ali'); --正确
insert into t_user(id,name) values(2,'ali'); --正确
insert into t_user(name) values('ali'); --错误,主键为空
insert into t_user(id,name) values(2,'ali'); --错误,主键重复
# 删除主键约束
alter table t_user drop constraint pk ;
# 测试3
insert into t_user(id,name) values(1,'ali'); --正确
insert into t_user(id,name) values(2,'ali'); --正确
insert into t_user(name) values('ali'); --正确,id可以为空
insert into t_user(id,name) values(2,'ali');--正确,id可以重复
- 2.5 外键【外键所取的值必须在另一个表的主键中存在】
执行以下命令:
# 创建一个班级表,初始化几条记录
drop table t_class;
create table t_class(id int,name varchar(20));
insert into t_class(id,name) values(1,'java');
insert into t_class(id,name) values(2,'python');
insert into t_class(id,name) values(3,'cpp');
# 创建学生表,在创建表的时候就添加外键约束
create table t_student(id int, name varchar(20) ,classid int,
constraint fk foreign key (classid) references t_class(id)
)
# 测试1
insert into t_student(id,name,classid) values(1,'ali',1);--正确
insert into t_student(id,name) values(2,'zhangli');--正确,外键可以为空
insert into t_student(id,name,classid) values(2,'xiaoli',8);--错误,外键的值必须在student表的主键中出现
delete from t_class where id=1;--错误,因为这个1被学生表中记录关联外键
以上就是oracle中表的约束。