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
SQL语句复习【专题七】的更多相关文章
- SQL语句复习【专题一】
SQL语句复习[专题一] --创建用户 scott 并设置密码为 tiger create user scott identified by tiger --用户刚刚创建没有任何的权限,连登录的权限都 ...
- SQL语句复习【专题二】
SQL语句复习[专题二] 单行函数(日期.数学.字符串.通用函数.转换函数)多行函数.分组函数.多行数据计算一个结果.一共5个.sum(),avg(),max(),min(),count()分组函数 ...
- SQL语句复习【专题三】
SQL语句复习[专题三] DML 数据操作语言[insert into update delete]创建表 简单的方式[使用查询的结果集来创建一张表]create table temp as sele ...
- SQL语句复习【专题四】
SQL语句复习[专题四] 多表查询 sql 92多表查询 sql92.sql99 标准--查询所有员工的姓名,部门编号,部门名称select * from empselect * from dept- ...
- SQL语句复习【专题五】
SQL语句复习[专题五] 单行子查询:只会得到一个结果的子查询[子查询的内容必须放在小括号中.在查询语句中的查询语句 ]--查询所有比 CLARK 员工 工资高的员工--1.先查询 CLARK 员工的 ...
- SQL语句复习【专题六】
SQL语句复习[专题六] 用户 + 创建表 --创建一个新的用户,然后给新的用户创建一张表,然后给表中添加一些数据.查询表中的数据 --创建用户需要比较大的权限 DBA create user di ...
- SQL语句复习【专题八】
SQL语句复习[专题八] 序列 Sequence.数据库对象是 oracle 专有的.作用:可以将某一列的值使用序列,来实现自动增长的功能.访问序列的值.[序列有两个属性 nextval currva ...
- SQL语句复习【专题九】
SQL语句复习[专题九] 视图:View视图的概念:视图是从若干基本表或其他视图构造出来的表.在创建一个视图时,只是存放的视图的定义,也即是动态检索数据的查询语句,而并不存放视图对应的数据在用户使用视 ...
- sql语句复习(基础-提升-技巧-经典数据开发案例-sql server配置)
1 基础 1.说明:创建数据库 CREATE DATABASE database-name charset=utf8 2.说明:删除数据库 drop database dbname 3.说明:备份sq ...
随机推荐
- Linux下通过crontab命令来实现定时任务
一.crond的介绍 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动cr ...
- javascrip参考资料
阮一峰: http://javascript.ruanyifeng.com/ 廖雪峰: https://www.liaoxuefeng.com/ Mozila: https://developer.m ...
- 树莓派上安装Samba实现树莓派与Windows间的文件共享
我是参考这篇文章的: https://www.jianshu.com/p/ead92b06318e 安装samba和common-bin库(具有smbpasswd效用) sudo apt-get in ...
- cocos2dx-android-添加64位编译
Application.mk: APP_ABI := armeabi arm64-v8a build.gradle: android{ ndk{ abiFilters "armeabi&qu ...
- django 之(一) --- DjangoRestFormwork
接口概念 IOP:面向接口编程,不再关注具体的实现:只关注输入.输出. http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practice ...
- PJzhang:kali linux安装virtualbox虚拟机和chrome浏览器
猫宁!!! 参考链接: https://www.cnblogs.com/zhishuai/p/8007410.html kali linux 安装virtualbox. 查询系统的版本 apt-cac ...
- 《Java语言程序设计》第三讲类与对象“动手动脑”
一.以下代码为何无法通过编译?哪儿出错了? 答: 如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法. 二. (1)以下代码输出结果是什么? package xy; public cla ...
- 【VS开发】CListCtrl控件使用
为何调用了CListCtrl的InsertColumn却什么效果都没有?这个问题以前发现过,今天才清楚,那就是要把它的Style指定为LVS_REPORT. 具体做法如下: 假 ...
- prometheus 监控的目标 - nginx - apache
1.jvm类型 8563的grafanadashboard: gc时间,使用的现场,加载的类数 2.apache , nginx 用户连接状态,waiting数量 (使用nginx_status) c ...
- 前端控制台 JavaScript函数报错 SyntaxError: expected expression, got ';' SyntaxError: expected expression, got 'if'
在火狐浏览器下调试时, 页面报错SyntaxError: expected expression, got ';'或者SyntaxError: expected expression, got 'if ...