欢迎光临散文网 会员登陆 & 注册

Oracle外键规律,分页查询,个人对事务,回滚,锁,视图,序列,索引,同义词的理解

2021-03-05 21:27 作者:诗书画唱  | 我要投稿

前言:有时连我自己都不敢相信,自己每次写这种干货满满的专栏有时都至少要花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:序列

这个我认为还是MySQL的自增的使用更方便



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



代码参考例子 END


Oracle外键规律,分页查询,个人对事务,回滚,锁,视图,序列,索引,同义词的理解的评论 (共 条)

分享到微博请遵守国家法律