数据库---联合主键+序列+索引+视图+事务+导入导出+数据库表的映射关系

1.联合主键

联合主键:表的主键是由多个字段构成的,称为“联合主键”。
联合主键的约束:构成联合主键的每个字段的值可以重复,但是组合在一起不能重复
例如:下面的sc表中的S#和C#两个字段构成了联合主键,此时会约束2个字段,单独S#或C#字段的值可以重复,但是组合在一起(出现在同一条记录中)就不能重复了,下面的数据是违反约束条件。
在这里插入图片描述
总结:表的主键可以是单一主键,也可以是联合主键,
单一主键:使用表中一个字段作为主键,此时主键约束只能约束该字段
联合主键:使用表中多个字段作为主键,联合主键约束要写在表最后面,该约束要求每个字段值可以重复,但不能同时重复
create table sc(
   S# varchar(5) references student(S#) ,
   C# varchar(5) references COURSE(C#) ,
   score number(2),
– 添加主键约束,就是把主键设置为1个或多个字段,如果多个字段构成主键,叫联合主键,只能写在表的最后面
   constraint PK_sc primary key(S#,C#)

)

2.序列

序列:产生一组连续递增(减)的数字
CREATE SEQUENCE 序列名
[increment by n]
[start with n]
[maxvalue n|nomaxvalue]
[minvalue n|nominvalue]
[cycle|nocycle]
[cache n|nocache]
increment by n:n是一个正数或负数,表示序列的增量,即每次增加多少,如果n>0,则表示该序列是递增的序列,即产生一组连续递增的数字,每次增加n;如果n<0,则序列是递减的,产生一组连续递减的数字.
start with n:序列的初始值是n,从n开始
maxvalue n:序列产生的最大数字是n
nomaxvalue:没有指定序列最大值,对于递增序列,最大值是10的27次方;对于递减序列,最大值是-1。
minvalue n:序列产生的最小数字是n

序列的使用:
1).用序列.nextval获得序列的下一个值,通常用它给表的主键赋值
insert into t_student values(seq_t_student.nextval,‘jack’);
insert into t_student values(seq_t_student.nextval,‘mike’);
insert into t_student values(seq_t_student.nextval,‘lucy’);
当使用序列给表的主键赋值时,主键的类型是number类型,主键就能自动递增了。
2)用序列.currval获取序列的当前值
select seq_t_student.currval from dual;
删除序列
drop sequence 序列名

3.索引

索引是类似于字典目录的数据库对象,存储的是数据的指针,通过指针,oracle服务器可以快速搜索到该指针所指向的具体数据,即通过索引能快速访问到数据,提高查询效率。
Oracle的索引是添加在列上面,当在某列上创建了索引后,以后根据该列来查询数据将变得很快,即where 字段(建立索引的字段)=xxx

Oracle服务器自动在表主键上创建索引,所以要查询某一条记录时,推荐根据主键来查询

Oracle索引的创建方式
1.自动创建:oracle服务器会自动在主键列或者唯一键上创建唯一索引(唯一键:添加了唯一约束的字段)
2.手动创建:我们可以自己创建非唯一索引
语法: CREATE INDEX 索引名
ON table (column[, column]…);
例如:
create index idx_emp on emp(deptno)
补充:在表的字段上建立索引时,不是一定会加快查询速度的,只有当字段的值在10w及以上时,在字段上建索引才会有明显加快查询的效果。

4视图

视图是从基本表或其它视图中构造出来的“虚表”。在创建视图时,只需要指定动态查询数据的查询语句,而并没有把实际数据保存在视图中,实际数据保存在基本表中
视图可以看成是虚表,因为它不存放实际的数据,视图是通过查询语句来引用实际的数据,当我们使用视图中,oracle会自动搜索它所对应的实际数据,我们可以把复杂查询语句封装到视图中,从而避免每次写复杂查询语句。
对普通用户scott来说,他没有创建视图的权限,需要system给它授权

在这里插入图片描述
创建视图
create view myview1
as select empno,ename,sal from emp;

使用视图查询数据
语法:select * from 视图名;
创建或修改视图 ,此时如果要修改视图,就不需要先把视图删掉
create or replace view myview3
as select empno,ename,sal,job from emp;
对视图的DML操作会影响到底层的基本表,其实就是对背后的基本表的操作。
insert into myview1 values(7999,‘Mklu’,3000);
加了with read only的视图是只读视图,就不能对视图做DML操作
CREATE OR REPLACE VIEW MYVIEW2
AS
SELECT EMPNO,ENAME,JOB,SAL,DEPTNO
FROM EMP
WHERE DEPTNO >=20
>WITH READ ONLY; //设置视图只能读,屏蔽对视图的insert或update操作

删除视图: drop view 视图名;
删除视图时,不会删除基本表的数据
基于一个已存在的视图去创建一个视图
– select * from myview3

create or replace view myview4
as select * from myview3 where job=‘CLERK’
with read only;

5.事务

事务:一组相关的操作,就是一组DML操作,使用事务可以保证数据的安全有效。最经典的事务案例就是转账,A–>money减少,B–>money增加,如果A减少了,B就必须增加,保证在转账前后两人的总money不变。
事务的4个特点(ACID):
1.A:原子性:事务中所有数据的修改,要么全部执行,要么全部不执行,即要么都成功,要么都失败
2.一致性
3. 隔离性:2个事务是彼此隔离的,如果A事务在操作表a的某行记录,B事务必须等待A事务结束后才能去操作表a
4.持久性:事务对数据的修改必须是持久有效的
事务的开始和结束
事务开始于1条DML语句,结束于以下4种情况
1).手动执行commit提交事务或执行rollback回滚事务(在sqlplus或PLSQL Developer中要手动提交或回滚)
2)执行DDL语句自动提交事务
3)用户正常断开连接时,Transaction自动提交。
4) 系统崩溃或断电时事务自动回滚。

事务常用操作
1)commit:手动提交事务(提交当前未结束的事务)
2) rollback:回滚全部事务,撤销所有DML语句所做的更改
3) savepoint 保存点名称: 设置一个保存点
4) rollback to 保存点名称:撤销部分事务
如下所示,只会撤销b保存点下面的事务(删除7877的记录),执行rollback to b撤销了第2个事务(第2个事务结束了)

在这里插入图片描述

最后执行提交后,将a下面的第1个事务提交(结束事务1),此时数据库emp表中就没有编号为7999的记录,7877的记录还有

在这里插入图片描述

只有当事务都结束了以后,多个不同的oracle客户端里才会看到一致的数据(数据同步)
事务:一组DML操作(1个或多个insert,update,delete语句),具体oracle会把几个DML语句当成一个事务,取决于commit或rollback写在哪里
Delete from emp where empno=7732;
Commit;或rollback; (告诉oracle提交一个DML语句,这个DML语句就是一个事务)

Delete from emp where empno=7732;
Delete from emp where empno=7736;
Commit; (告诉oracle有2个DML语句需要提交,事务包含2个DML语句)
以下语句表示有2个事务,每个事务都只有1个DML语句
Delete from emp where empno=7732;
Commit;
Delete from emp where empno=7736;
rollback;

6.导入导出

导入:将其它数据源(excel文件等)的数据导入到数据库中(数据迁移)
导出:将数据库中的数据导出到其它数据源(excel文件等)中(数据备份)

导出命令:exp
在这里插入图片描述

导入命令:imp
在这里插入图片描述
导出表的数据和结构–使用navicat
1.导出
在这里插入图片描述

保存为.sql文件,当选择了多个表后,sql文件名默认就是第1个表名,文件名:xxx.sql
2.导入
找到导出操作所保存的xxx.sql文件,点击”开始”按钮

在这里插入图片描述

在这里插入图片描述

7.数据库表的映射关系

多对一:两个表的之间数量比例,如员工表对部门表是多对一的
一对多:从相反角度来看,部门表和员工表之间就是一对多的。
在多对一情况下,外键必须是在多方表上,如emp表.
生活中: 老师对学生是1对多的,学生对老师是多对1的
多对多映射关系:

一个学生可以学习多门课程,一个课程可以被多个学生学习,此时学生和课程表就是多对多的关系,在设计表时,必须加入中间表,中间表中保存2个外键,同时它们又是联合主键
1.学生表student
学号(主键) 学生姓名   性别
101      张三   男
102      李四   女

2.课程表course
课程号(主键) 课程名
C101     语文
C102     数学
3. 学生课程中间表stu_course,中间表中只需要存2个外键,分别参照学生表和课程表,同时这2个外键又构成了联合主键
学生号(主键) 课程号(主键)
101     C101
102     C101
101     C102
中间表的作用:将学生和课程的多对多关系转换为2个一对多
以后经常用的就是一对多/多对一, 多对多

多对多实际例子:用户user和角色role之间,一个用户可以有多个角色,同时1个角色可以授予多个用户
张三 市委书记
张三 市长
李四 副市长
王五 副市长

猜你喜欢

转载自blog.csdn.net/qq_41532872/article/details/86661918