Oracle外键规律,分页查询,个人对事务,回滚,锁,视图,序列,索引,同义词的理解
前言:有时连我自己都不敢相信,自己每次写这种干货满满的专栏有时都至少要花5个小时以上,这篇,我就是1点左右,思考,搜索,打字,截图,理解,创造,创新,记录,写代码等几乎不间断时间地写出来的,写到21:00左右。

绝对不比一些视频的制作轻松,而且自己目前这样坚持了几百篇,有点小成就感。果然,在一些方面和时候,我的耐心和耐力都强得可怕。求三连啊!这期的内容特别实用!
内容概括:
事务处理.ppt
个人对事务的理解
个人对事务的隔离性的理解
个人对回滚的理解
个人对行级锁的运用,作用的理解
个人对死锁的理解
个人对重要作用的视图的理解
个人对sequence序列,索引,synonym同义词的理解
个人对表级锁的理解
个人对事物的一致性的理解
为什么使用insert语句时要点一个绿色按钮来提交事物的原因
作业
代码参考例子
1、创建一个宠物表pet,包含id,name,color,age,type(宠物类型:猫,狗等)
2、创建一个宠物类型表ptype,包含id,name
3、给pet表的type字段和ptype表的id字段添加一个外键引用约束。
add constraint ...
外键规律:
【个人总结:有主键的放references后面比如ptype表中的id有主键】
4、给ptype表创建一个名为pt的同义词。
5、通过创建序列往两个表中插入至少三条数据
6、创建一个视图,查询这个视图可以看到宠物的name,color,age和typename属性。
7、对Pet表进行分页查询:
每页显示3条数据,显示第2页的数据
每页显示10条数据,显示第1页的数据
事务处理.ppt START



事务处理.ppt END
个人对事务的理解 START
引例(用来引用说明的例子):
银行转账业务。
电子商务网中的用户购物,库存与账户余额处理。
批量的录入数据。
什么是事务:
一个事务是一系列连续的数据库操作,如果其中的任何一步操作失败,则代表着整个事务的失败。
事务的四大特征:
事务都应该具备ACID特征。所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持续性)四个词的首字母所写。下面以“银行转帐”为例来分别说明一下它们的含义:
原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。
一致性:在事务处理执行前后,数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户(操作成功),要么两个帐户都不变(操作失败)。
隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。比如说,银行转帐过程中,在转帐事务没有提交之前,如果另一个转帐事务需要修改相应的前面事务的数据,则需要等待前一事务完成才可以。
持续性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。比如:银行转帐过程中,转帐后帐户的状态要能被保存下来。
个人对事物的理解 END
讲义 START

我的账号和家里的银行账号
bank:id,account(账号),balance(余额)
1 小明 9800.43
2 家里 12000
ACID:
A原子性,C一致性,I隔离性,D持续性
你不还我钱,我就不买车
你不买车,我就不换钱
oracle分页查询:使用伪列rownum实现
每页显示4条数据,显示第1页的数据
rows = 4;
page = 1;
讲义 END
个人对事务的理解 START



个人对事务的理解 END
个人对事务的隔离性的理解 START

个人对事务的隔离性的理解 END
个人对回滚的理解 START

类时于PS,AU,水果软件等中的历史记录,或是
一些软件的CTRL+Z的“反悔”和“后退一步”等的功能。这里复原的是数据库的变化情况。

个人对回滚的理解 END
个人对行级锁的运用,作用的理解 START



最好用代码“锁”。
“锁”上后,别人就改不了数据等等。
当然这种全变蓝的效果,可能上不了锁,只是演示下,用代码上锁。
个人对行级锁的运用,作用的理解 END
个人对死锁的理解 START

个人对死锁的理解 END
个人对重要作用的视图的理解 START


--创建一个名为proinfo的视图
create view proinfo as
select t1.pname name,t1.price price,t2.tname
from product t1,protype t2
where t1.ptype = t2.id;
--查询视图
select * from proinfo;
个人对重要作用的视图的理解 END
个人对sequence序列,索引,synonym同义词的理解 START
sequence:序列









dual是Oracle中的一个伪表,利用这个伪表可以设置或查看序列,或者是调用一些内置的函数,方便操作。
如:
SELECT SYSDATE FROM dual;
SELECT seq.nextval FROM dual;

简单来说,dual表就是oracle与数据字典自动创建的一张表,这张表是一个单行单列的表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X', Oracle有内部逻辑保证dual表中永远只有一条数据。dual表主要是用来选择系统变量或是求一个表达式的值。
比如:
--求系统当前时间
SELECT sysdate FROM daul
--求系统当前时间,并按设定的格式显示
select to_char(sysdate,''yyyy-mm-dd hh24:mi:ss'') from dual;
--当计算器使用
select 1+2 from dual

dummy:虚设






序列就是用来实现自动增长的,索引就是用来快速查找信息的。



个人认为序列是用来查不重复数据用的,比如id列。
同义词就是别名,是表的列名的别名,类似于我之前使用SQLServer时遇到的“虚拟列”,
或是对象的别名,比如用户的别名。

--给emp表创建一个别名(同义词)
--sys账号登录
create public synonym a for j190802.emp;
--删除同义词
drop public synonym a;
--j190802账号登录
select * from a;
【当然,我习惯用dba管理员进行创建表,起别名等的操作,上面的代码的话就是
用sys这个管理员身份的账号给普通身份的j190802中创建的表起别名,之后退出sys账号,
用j190802来查看起别名是否生效。】




synonym:同义词

个人对sequence序列,索引,synonym同义词的理解 END
个人对表级锁的理解 START

个人对表级锁的理解 END
个人对事物的一致性的理解 START

个人对事物的一致性的理解 END
为什么使用insert语句时要点一个绿色按钮来提交事物的原因 START


为什么使用insert语句时要点一个绿色按钮来提交事物的原因 END
作业 START
分页查询,序列等的作业 START
1、创建一个宠物表pet,包含id,name,color,age,type(就是typeid,
宠物类型:猫,狗等)
【备用语句: drop table pet;
drop table ptype;
--删除同义词:
drop public synonym pt;
--删除序列:
drop sequence seq_ptype;
drop sequence seq_pet;】
答:
create table pet(
id number primary key,
name varchar2(30) not null,
color varchar2(30),
age number,
typeid number
);
2、创建一个宠物类型表ptype,包含id,name
答:
create table ptype(
id number primary key,
typename varchar2(30) not null
);
3、给pet表的type字段和ptype表的id字段添加一个外键引用约束。
add constraint ...
答:
alter table pet add constraint
FK_pet foreign key(typeid) references ptype(id);
外键规律:
【个人总结:有主键的放references后面比如ptype表中的id有主键】
4、给ptype表创建一个名为pt的同义词。
答:
create public synonym pt for ptype;
测试是否成功创建同义词:
select * from pt
5、通过创建序列往两个表中插入至少三条数据
create sequence seq_ptype
start with 1 --起始值是1
increment by 1 --增长的值
maxvalue 999999999 --序列号的最大值
minvalue 1 --序列号的最小值
nocycle --是否循环
cache 10; --预存
--select * from ptype
----select seq_ptype.nextval from ptype;【暂时不用】
--select seq_ptype.nextval from dual;【dual是oracle与数据字典自动创建的单行单列的表】
--select seq_ptype.currval from dual;
--drop sequence seq_ptype
insert into ptype values(seq_ptype.nextval,'猫');
insert into ptype values(seq_ptype.nextval,'狗');
insert into ptype values(seq_ptype.nextval,'兔子');
--select * from dual
create sequence seq_pet
start with 1 --起始值是1
increment by 1 --增长的值
maxvalue 999999999 --序列号的最大值
minvalue 1 --序列号的最小值
nocycle --是否循环
cache 10; --预存
--查询表的内容:
--select * from pet
--查询表的内容:
--select * from ptype
--激活序列号:
--select seq_pet.nextval from dual;(用dual代替pet)
--查询当前序列号最大值:
--select seq_pet.currval from dual;(用dual代替pet)
insert into pet values(seq_pet.nextval,'小黑','黑色',5,1);
insert into pet values(seq_pet.nextval,'小红','红色',6,2);
insert into pet values(seq_pet.nextval,'小黄','黄色',7,3);
insert into pet values(seq_pet.nextval,'小黑2','黑色',5,1);
insert into pet values(seq_pet.nextval,'小红2','红色',6,2);
insert into pet values(seq_pet.nextval,'小黄2','黄色',7,3);
insert into pet values(seq_pet.nextval,'小黑3','黑色',5,1);
insert into pet values(seq_pet.nextval,'小红3','红色',6,2);
insert into pet values(seq_pet.nextval,'小黄3','黄色',7,3);
insert into pet values(seq_pet.nextval,'小黑4','黑色',5,1);
insert into pet values(seq_pet.nextval,'小红4','红色',6,2);
insert into pet values(seq_pet.nextval,'小黄4','黄色',7,3);
6、创建一个视图,查询这个视图可以看到宠物的name,color,age和typename属性。
--创建一个名为petAndPtype的视图
create view petAndPtype as
select p1.name viewName,p1.color viewColor
,p1.age viewAge,p2.typename as viewTypename
from pet p1,Ptype p2
where p1.typeid = p2.id;
--查询视图【个人理解,视图就是“前期写的多,后面使用时方便,像是使用
--封装的2表查询语句为短短的一句,我发现”封装“很常用,也的确是减少
--重复,进而高效,个人认为”封装“就是编程代码的核心思想,有了这个思想,
--才出现编程】
select * from petAndPtype;
7、对Pet表进行分页查询:
每页显示3条数据,显示第2页的数据
每页显示10条数据,显示第1页的数据
--rows=3,page=2【自己使用前把公式写前面就可以快速算出rownum在不同位置的取值
--这个写公式在前面,类似写公式等规律在前面,给公式赋值做数学题或按照其他
--规律做事时更高效】
--end = rows * page=6
--start = (page - 1) * rows + 1=4
select * from
(select p1.*,rownum r1 from Pet p1
where rownum <= 6)
where r1 >= 4
--rows=10,page=1
--end = rows * page=10
--start = (page - 1) * rows + 1=1
select * from
(select p1.*,rownum r1 from Pet p1
where rownum <= 10)
where r1 >= 1
分页查询,序列等的作业 END

作业 END
代码参考例子 START
--创建银行账户表
create table bank(
id number primary key,
account varchar2(30) not null,
balance number(20,2)
);
insert into bank values(1,'小明',9800.43);
insert into bank values(2,'家',12000);
--转账功能
update bank set balance = balance - 2000 where id = 1;
update bank set balance = balance + 2000 where id = 2;
--提交事务
commit;
--回滚事务
--rollback;
--给emp表创建一个别名(同义词)
--sys账号登录
create public synonym a for j190802.emp;
--删除同义词
drop public synonym a;
--j190802账号登录
select * from a;
--序列,实现自动增长的列
--创建一个序列
create sequence seq_userinfo
start with 1 --起始值是1
increment by 1 --增长的值
maxvalue 999999999 --序列号的最大值
minvalue 1 --序列号的最小值
nocycle --是否循环
cache 10; --预存
--激活序列号
select seq_userinfo.nextval from dual;
--查看当前的序列号
select seq_userinfo.currval from dual;
--使用序列号实现自动增长的列的功能
insert into userinfo values(seq_userinfo.nextval,
'测试123',666,sysdate);
insert into userinfo values(seq_userinfo.nextval,
'test123',555,sysdate);
--sys账号登录
--授予j190802账号创建视图的权限
grant create view to j190802;
--j190802账号登录
--创建一个名为proinfo的视图
create view proinfo as
select t1.pname name,t1.price price,t2.tname
from product t1,protype t2
where t1.ptype = t2.id;
--查询视图
select * from proinfo;
--分页查询userinfo表。
--rows=3,page=2
--end = rows * page
--start = (page - 1) * rows + 1
select * from
(select t.*,rownum rn from userinfo t
where rownum <= 6)
where rn >= 4