SQL语句复习【专题七】

SQL语句复习【专题七】

完整性约束分类
1)域完整性约束(非空not null,检查check)
2)实体完整性约束(唯一unique,主键primary key)
3)参照完整性约束(外键foreign key)

域完整性约束:学生的名字、学生的年龄、学生性别。
实体完整性约束:email,学号。
参照完整性约束:某一列的值必须是其他的表的 主键。

命名规则推荐采用:约束类型_约束字段
1)非空约束  NN_表名_列名
2)唯一约束  UK_表名_列名
3)主键约束  PK_表名
4)外键约束  FK_表名_列名
5)检查约束  CK_表名_列名

1:约束相关【创建表的时候添加约束】
---【主键约束】 primary key
drop table student purge;
create table student(
--sno varchar2(6) constraints pk_student primary key, -- 列级主键约束
sno varchar2(6),-- primary key,--简单的列级主键约束。约束的名字系统自动生成。
sname varchar2(12),
sage number(3),
sgender varchar2(3),
cno varchar2(10),
semail varchar2(20),
--constraints pk_student primary key (sno)--表级添加约束
primary key (sno)--简化的表级主键约束
);
insert into student values ('000001','林徽因',19,'女','c0001','bai@qq.com');
insert into student values (null,'林徽因',19,'女','c0001','bai@qq.com');
select * from student

--【联合主键约束】只有表级约束,没有列级约束
drop table student purge;
--sno 和 sname 作为联合主键 两个列的值的组合是唯一的 联合主键的所有的字段都不能为空
create table student(
sno varchar2(6),
sname varchar2(12),
sage number(3),
sgender varchar2(3),
cno varchar2(10),
semail varchar2(20),
constraints pk_student primary key (sno,sname)--表级添加约束
--primary key (sno,sname) 简化的联合主键约束
);
insert into student values ('000002','林徽因',19,'女','c0001','bai@qq.com');
insert into student values (null,'林徽因',19,'女','c0001','bai@qq.com');

--【非空约束】not null
--ename 非空约束,只有列级
drop table student purge;
create table student(
sno varchar2(6),
--sname varchar2(12) ,--constraints nn_student_sname not null,--非空的列级约束
sname varchar2(12) not null,--简化的非空约束
sage number(3),
sgender varchar2(3),
cno varchar2(10),
semail varchar2(20),
constraints pk_student primary key (sno)--表级添加约束
--constraints nn_student_sname not null(sname) 非空约束只能是列级约束,不能作为表级约束
);
--插入测试数据
insert into student values ('000001',null,19,'女','c0001','bai@qq.com');
select * from student

--【唯一约束】 unique
--email 唯一的。可以是 null,而且可以有多个 null
drop table student purge;
create table student(
sno varchar2(6),
sname varchar2(12) not null,--简化的非空约束
sage number(3),
sgender varchar2(3),
cno varchar2(10),
--semail varchar2(20) constraints uk_student_semail unique, --列级 唯一约束
semail varchar2(20) ,--unique,--简单列级 唯一约束
constraints pk_student primary key (sno),--表级添加约束
--constraints uk_student_email unique(semail)--表级的 唯一约束
unique (semail)--简化的表级唯一约束
);
--插入测试数据
insert into student values ('000001','小白',19,'女','c0001','bai@qq.com');
insert into student values ('000002','小白',19,'女','c0001','bai@qq.com');
insert into student values ('000002','小红',19,'女','c0001',null);
insert into student values ('000003','小王',19,'女','c0001',null);
select * from student

--【检查约束】 check
--控制域的取值范围
drop table student purge;
create table student(
sno varchar2(6),
sname varchar2(12) not null,--简化的非空约束
sage number(3),-- constraint ck_student_sage check (sage >=18 and sage <= 30),--[18-30]---列级检查约束
sgender varchar2(3) default '男',-- check (sgender in ('男','女')) ,--列级简化检查约束
cno varchar2(10),
semail varchar2(20) ,
constraints pk_student primary key (sno),--表级添加约束
constraints uk_student_email unique(semail),--表级的 唯一约束
check (sage between 18 and 30),
constraint ck_student_sgender check (sgender in ('男','女'))
);
--插入测试数据
insert into student values ('000001','小白',19,'女','c0001','bai@qq.com');
insert into student values ('000002','小白',17,'女','c0001','bai@qq.com');
insert into student values ('000002','小红',19,'fe','c0001',null);
insert into student values ('000003','小王',19,'女','c0001',null);
select * from student

--【外键约束】foreign key
--表中的某些列是其他的表中的主键
--班级编号 是 班级表 的主键
--创建一张班级表
--主表:被引用字段的表,它的主键被其他的表作为外键使用。
--从表:使用其他的表的主键作为外键的表
create table clazz(
cno varchar2(6) primary key,
cname varchar2(20) unique,
cloc varchar2(30) not null
);
--插入测试数据
insert into clazz values('000001','京南508班','北京亦庄开发区');
insert into clazz values('000002','京南503班','北京亦庄开发区');
insert into clazz values('000003','西三旗302班','北京西三旗校区');
select * from clazz
drop table student purge;

create table student(
sno varchar2(6),
sname varchar2(12) not null,--简化的非空约束
sage number(3),
sgender varchar2(3) default '男',
cno varchar2(10) ,-- references clazz (cno),
semail varchar2(20) ,
constraints pk_student primary key (sno),--表级添加约束
constraints uk_student_email unique(semail),--表级的 唯一约束
check (sage between 18 and 30),
constraint ck_student_sgender check (sgender in ('男','女')),
constraint fk_student_cno foreign key (cno) references clazz (cno)--外键的表级约束
-- foreign key (cno) references clazz (cno)--简化的外键约束
);
--插入测试数据
insert into student values ('000001','小白',19,'女','000001','bai@qq.com');
insert into student values ('000002','小白',27,'女','000002','bai1@qq.com');
insert into student values ('000004','小红',19,'女','c0001',null);
insert into student values ('000003','小王',19,'女','000003',null);
select * from student;

---2:约束相关【创建表之后添加约束】
drop table student purge;
create table student(
sno varchar2(6),
sname varchar2(12) not null,--简化的非空约束 只能列级约束
sage number(3),
sgender varchar2(3) default '男',
cno varchar2(10) ,
semail varchar2(20)
--constraints pk_student primary key (sno),--表级添加约束
--constraints uk_student_email unique(semail),--表级的 唯一约束
-- check (sage between 18 and 30),
-- constraint ck_student_sgender check (sgender in ('男','女')),
-- constraint fk_student_cno foreign key (cno) references clazz (cno) on delete cascade--外键的表级约束---设置级联删除
-- constraint fk_student_cno foreign key (cno) references clazz (cno) on delete set null-----设置set null
);
select * from student

--创建表之后添加约束
--如果表中已经有数据违反了添加的约束,那么约束不能添加,必须将数据清除掉才能添加
alter table student add constraints pk_student primary key(sno);
alter table student add constraints uk_student_email unique(semail);
alter table student add constraints ck_student_sgender check (sgender in ('男','女'));
alter table student add constraints ck_student_sage check (sage between 18 and 30);
alter table student add constraints fk_student_cno foreign key(cno) references clazz (cno) on delete set null
--删除约束
alter table student drop constraints ck_student_sgender
insert into student values ('000004','小白',30,'fe','000002','bai12@qq.com');
delete student where sno='000004'

3:级联删除
---主表删除字段 级联删除问题
--删除主表的字段
--如果主表的字段没有被从表使用,那么可以直接删除。
delete from clazz where cno='000003'
---如果主表的字段有被从表使用,那么不可以直接删除。 这只是一种默认的情况。
delete from clazz where cno='000001'

--删除主表的记录,关于从表中的相关的记录的处理的方式 一共有三种。
--1:默认的 RESTRICT:删除受限制。如果从表中使用了某一个主表中的字段的值,那么主表中的值不允许删除。
--2:cascade:级联删除。如果主表中的某个记录被删除,那么从表中对于该记录的引用的记录也一并删除。
--3: set null : 如果主表中的 记录被删除掉,那么从表中对于主表的该记录的引用的相关的 内容 直接设置为 null。
drop table student purge;
create table student(
sno varchar2(6),
sname varchar2(12) not null,--简化的非空约束
sage number(3),
sgender varchar2(3) default '男',
cno varchar2(10) ,
semail varchar2(20) ,
constraints pk_student primary key (sno),--表级添加约束
constraints uk_student_email unique(semail),--表级的 唯一约束
check (sage between 18 and 30),
constraint ck_student_sgender check (sgender in ('男','女')),
-- constraint fk_student_cno foreign key (cno) references clazz (cno) on delete cascade--外键的表级约束---设置级联删除
constraint fk_student_cno foreign key (cno) references clazz (cno) on delete set null-----设置set null
);
insert into student values ('000001','小白',19,'女','000001','bai@qq.com');
insert into student values ('000003','小白',30,'女','000002','bai1@qq.com');
select * from student
--删除主表的一行记录
delete from clazz where cno='000001'

---删除主表
--直接删除主表,如果主表的某些记录被从表所引用,那么是不能删除的。
drop table clazz
--将从表中的数据全部删除
delete student
truncate table student
--即使从表中的数据没有对主表的数据有任何的引用,那么也不能直接删除主表。约束对象对 主表是有引用的。
select * from clazz
--如果想直接删除主表,那么必须和主表相关的约束一并删除。
--从表中相关的字段对主表的引用,不做任何的处理。
drop table clazz cascade constraints
select * from student

原文地址:https://www.cnblogs.com/cao-yin/p/10502873.html