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

SQL语句复习【专题七】的更多相关文章

  1. SQL语句复习【专题一】

    SQL语句复习[专题一] --创建用户 scott 并设置密码为 tiger create user scott identified by tiger --用户刚刚创建没有任何的权限,连登录的权限都 ...

  2. SQL语句复习【专题二】

    SQL语句复习[专题二] 单行函数(日期.数学.字符串.通用函数.转换函数)多行函数.分组函数.多行数据计算一个结果.一共5个.sum(),avg(),max(),min(),count()分组函数  ...

  3. SQL语句复习【专题三】

    SQL语句复习[专题三] DML 数据操作语言[insert into update delete]创建表 简单的方式[使用查询的结果集来创建一张表]create table temp as sele ...

  4. SQL语句复习【专题四】

    SQL语句复习[专题四] 多表查询 sql 92多表查询 sql92.sql99 标准--查询所有员工的姓名,部门编号,部门名称select * from empselect * from dept- ...

  5. SQL语句复习【专题五】

    SQL语句复习[专题五] 单行子查询:只会得到一个结果的子查询[子查询的内容必须放在小括号中.在查询语句中的查询语句 ]--查询所有比 CLARK 员工 工资高的员工--1.先查询 CLARK 员工的 ...

  6. SQL语句复习【专题六】

    SQL语句复习[专题六] 用户 + 创建表  --创建一个新的用户,然后给新的用户创建一张表,然后给表中添加一些数据.查询表中的数据 --创建用户需要比较大的权限 DBA create user di ...

  7. SQL语句复习【专题八】

    SQL语句复习[专题八] 序列 Sequence.数据库对象是 oracle 专有的.作用:可以将某一列的值使用序列,来实现自动增长的功能.访问序列的值.[序列有两个属性 nextval currva ...

  8. SQL语句复习【专题九】

    SQL语句复习[专题九] 视图:View视图的概念:视图是从若干基本表或其他视图构造出来的表.在创建一个视图时,只是存放的视图的定义,也即是动态检索数据的查询语句,而并不存放视图对应的数据在用户使用视 ...

  9. sql语句复习(基础-提升-技巧-经典数据开发案例-sql server配置)

    1 基础 1.说明:创建数据库 CREATE DATABASE database-name charset=utf8 2.说明:删除数据库 drop database dbname 3.说明:备份sq ...

随机推荐

  1. 横向对比分析Python解析XML的四种方式

    横向对比分析Python解析XML的四种方式 在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜 ...

  2. 同步pod容器内时区

    同步pod容器内时区 .直接修改镜像的时间设置,好处是应用部署时无需做特殊设置,但是需要手动构建Docker镜像. .部署应用时,单独读取主机的“/etc/localtime”文件,即创建pod时同步 ...

  3. cmake 在mac系统的安装

    CMake是一个比make更高级的跨平台的安装.编译.配置工具,可以用简单的语句来描述所有平台的安装(编译过程).并根据不同平台.不同的编译器,生成相应的Makefile或者project文件.本文主 ...

  4. VMware Workstation 12许可证

    VMware 12专业版永久许可证密钥: 5A02H-AU243-TZJ49-GTC7K-3C61N VF5XA-FNDDJ-085GZ-4NXZ9-N20E6 UC5MR-8NE16-H81WY-R ...

  5. Windows Server 2019 SSH Server

    Windows Server 2019 SSH Server   在需要安裝的ws2019开启powershell,执行安装 openssh server 指令 Add-WindowsCapabili ...

  6. 高性能Linux服务器

    TCP/IP协议族——高性能Linux服务器编程   现在 Internet 使用的主流协议族是 TCP/IP 协议族,它是一个分层.多协议的通信体系. TCP/IP 协议族体系结构以及主要协议 TC ...

  7. 手把手教你用原始方式上传项目至GitHub

    小编GitHub:https://github.com/ds1889 首先你得注册一个自己的GitHub账号,注册网址:https://github.com/join 有了自己的账号以后,就可以进行登 ...

  8. [转帖]SSL延迟有多大?

    SSL延迟有多大? http://www.ruanyifeng.com/blog/2014/09/ssl-latency.html 转帖 作者: 阮一峰 日期: 2014年9月24日 感谢 腾讯课堂N ...

  9. DOS ftp

    C:\>ftp /? 将文件传送到运行 FTP 服务器服务(经常称为后台程序)的计算机以及将文件从该计算机传出.可以交互使用 Ftp. FTP [-v] [-d] [-i] [-n] [-g] ...

  10. IDEA自动生成的注释模板

    使用效果如下: * * @功能描述 : $params$ * @return $returns$ * @author xuetao */ 其中 $params$的表达式如下: groovyScript ...