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. Go项目实战:打造高并发日志采集系统(二)

    日志统计系统的整体思路就是监控各个文件夹下的日志,实时获取日志写入内容并写入kafka队列,写入kafka队列可以在高并发时排队,而且达到了逻辑解耦合的目的.然后从kafka队列中读出数据,根据实际需 ...

  2. nodeslector使用

    问题: node节点挂了一个, 无法切换到另一个node上 解决: .指定了 nodeslector .设置了下面: hostNetwork: true dnsPolicy: ClusterFirst ...

  3. VS2012编译php扩展

    注意:用VS2015来做会比较好! 开发前准备工作:cygwinvisual studio 2012php编译后的程序      使用的是 xampp集成安装包,所以编译后的程序路径为D:\xampp ...

  4. v-for与v-if的优先级

    原文地址 永远不要把 v-if 和 v-for 同时用在同一个元素上. 一般我们在两种常见的情况下会倾向于这样做: 为了过滤一个列表中的项目 (比如 v-for="user in users ...

  5. 解读Vue.use()源码

    Vue.use() vue.use()的作用: 官方文档的解释: 安装 Vue.js 插件.如果插件是一个对象,必须提供 install 方法.如果插件是一个函数,它会被作为 install 方法.i ...

  6. 感知器做二分类的原理及python实现

    本文目录: 1. 感知器 2. 感知器的训练法则 3. 梯度下降和delta法则 4. python实现 1. 感知器[1] 人工神经网络以感知器(perceptron)为基础.感知器以一个实数值向量 ...

  7. MATLAB实现图像的代数运算

    目录 1.使用求补运算对各类图像进行处理 2.利用imlincomb函数将图像的灰度值放大1.5倍 3.利用imlincomb函数计算两幅图像的平均值. 4.图像的加法运算 5.利用imnoise函数 ...

  8. 【并行计算-CUDA开发】GPU 的硬体架构

    GPU 的硬体架构   这里我们会简单介绍,NVIDIA 目前支援CUDA 的GPU,其在执行CUDA 程式的部份(基本上就是其shader 单元)的架构.这里的资料是综合NVIDIA 所公布的资讯, ...

  9. 论文阅读 | Text Processing Like Humans Do: Visually Attacking and Shielding NLP Systems

    [code&data] [pdf] 主要工作 文章首先证明了对抗攻击对NLP系统的影响力,然后提出了三种屏蔽方法: visual character embeddings adversaria ...

  10. 【Python】【demo实验29】【练习实例】【使用turtle画五角星】

    原题: 使用turtle画五角星: 我的代码: #!/usr/bin/python # encoding=utf-8 # -*- coding: UTF-8 -*- from turtle impor ...