Oracle外鍵規(guī)律,分頁查詢,個人對事務(wù),回滾,鎖,視圖,序列,索引,同義詞的理解
前言:有時連我自己都不敢相信,自己每次寫這種干貨滿滿的專欄有時都至少要花5個小時以上,這篇,我就是1點(diǎn)左右,思考,搜索,打字,截圖,理解,創(chuàng)造,創(chuàng)新,記錄,寫代碼等幾乎不間斷時間地寫出來的,寫到21:00左右。

絕對不比一些視頻的制作輕松,而且自己目前這樣堅(jiān)持了幾百篇,有點(diǎn)小成就感。果然,在一些方面和時候,我的耐心和耐力都強(qiáng)得可怕。求三連??!這期的內(nèi)容特別實(shí)用!
內(nèi)容概括:
事務(wù)處理.ppt?
個人對事務(wù)的理解
個人對事務(wù)的隔離性的理解
個人對回滾的理解
個人對行級鎖的運(yùn)用,作用的理解
個人對死鎖的理解
個人對重要作用的視圖的理解?
個人對sequence序列,索引,synonym同義詞的理解
個人對表級鎖的理解
個人對事物的一致性的理解
為什么使用insert語句時要點(diǎn)一個綠色按鈕來提交事物的原因?
作業(yè)?
代碼參考例子
1、創(chuàng)建一個寵物表pet,包含id,name,color,age,type(寵物類型:貓,狗等)
2、創(chuàng)建一個寵物類型表ptype,包含id,name
3、給pet表的type字段和ptype表的id字段添加一個外鍵引用約束。
add constraint ...
外鍵規(guī)律:
【個人總結(jié):有主鍵的放references后面比如ptype表中的id有主鍵】
4、給ptype表創(chuàng)建一個名為pt的同義詞。
5、通過創(chuàng)建序列往兩個表中插入至少三條數(shù)據(jù)
6、創(chuàng)建一個視圖,查詢這個視圖可以看到寵物的name,color,age和typename屬性。
7、對Pet表進(jìn)行分頁查詢:
每頁顯示3條數(shù)據(jù),顯示第2頁的數(shù)據(jù)
每頁顯示10條數(shù)據(jù),顯示第1頁的數(shù)據(jù)
事務(wù)處理.ppt START



事務(wù)處理.ppt END
個人對事務(wù)的理解 START
引例(用來引用說明的例子):
銀行轉(zhuǎn)賬業(yè)務(wù)。
電子商務(wù)網(wǎng)中的用戶購物,庫存與賬戶余額處理。
批量的錄入數(shù)據(jù)。
什么是事務(wù):
一個事務(wù)是一系列連續(xù)的數(shù)據(jù)庫操作,如果其中的任何一步操作失敗,則代表著整個事務(wù)的失敗。
事務(wù)的四大特征:
事務(wù)都應(yīng)該具備ACID特征。所謂ACID是Atomic(原子性),Consistent(一致性),Isolated(隔離性),Durable(持續(xù)性)四個詞的首字母所寫。下面以“銀行轉(zhuǎn)帳”為例來分別說明一下它們的含義:
原子性:組成事務(wù)處理的語句形成了一個邏輯單元,不能只執(zhí)行其中的一部分。換句話說,事務(wù)是不可分割的最小單元。比如:銀行轉(zhuǎn)帳過程中,必須同時從一個帳戶減去轉(zhuǎn)帳金額,并加到另一個帳戶中,只改變一個帳戶是不合理的。
一致性:在事務(wù)處理執(zhí)行前后,數(shù)據(jù)庫是一致的。也就是說,事務(wù)應(yīng)該正確的轉(zhuǎn)換系統(tǒng)狀態(tài)。比如:銀行轉(zhuǎn)帳過程中,要么轉(zhuǎn)帳金額從一個帳戶轉(zhuǎn)入另一個帳戶(操作成功),要么兩個帳戶都不變(操作失敗)。
隔離性:一個事務(wù)處理對另一個事務(wù)處理沒有影響。就是說任何事務(wù)都不可能看到一個處在不完整狀態(tài)下的事務(wù)。比如說,銀行轉(zhuǎn)帳過程中,在轉(zhuǎn)帳事務(wù)沒有提交之前,如果另一個轉(zhuǎn)帳事務(wù)需要修改相應(yīng)的前面事務(wù)的數(shù)據(jù),則需要等待前一事務(wù)完成才可以。
持續(xù)性:事務(wù)處理的效果能夠被永久保存下來。反過來說,事務(wù)應(yīng)當(dāng)能夠承受所有的失敗,包括服務(wù)器、進(jìn)程、通信以及媒體失敗等等。比如:銀行轉(zhuǎn)帳過程中,轉(zhuǎn)帳后帳戶的狀態(tài)要能被保存下來。
個人對事物的理解 END
講義 START

我的賬號和家里的銀行賬號
bank:id,account(賬號),balance(余額)
1 小明? 9800.43
2 家里? 12000
ACID:
A原子性,C一致性,I隔離性,D持續(xù)性
你不還我錢,我就不買車
你不買車,我就不換錢
oracle分頁查詢:使用偽列rownum實(shí)現(xiàn)
每頁顯示4條數(shù)據(jù),顯示第1頁的數(shù)據(jù)
rows = 4;
page = 1;
講義 END
個人對事務(wù)的理解 START



個人對事務(wù)的理解 END
個人對事務(wù)的隔離性的理解 START

個人對事務(wù)的隔離性的理解 END
個人對回滾的理解 START

類時于PS,AU,水果軟件等中的歷史記錄,或是
一些軟件的CTRL+Z的“反悔”和“后退一步”等的功能。這里復(fù)原的是數(shù)據(jù)庫的變化情況。

個人對回滾的理解 END
個人對行級鎖的運(yùn)用,作用的理解 START



最好用代碼“鎖”。
“鎖”上后,別人就改不了數(shù)據(jù)等等。
當(dāng)然這種全變藍(lán)的效果,可能上不了鎖,只是演示下,用代碼上鎖。
個人對行級鎖的運(yùn)用,作用的理解?END
個人對死鎖的理解 START

個人對死鎖的理解 END
個人對重要作用的視圖的理解 START


--創(chuàng)建一個名為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中的一個偽表,利用這個偽表可以設(shè)置或查看序列,或者是調(diào)用一些內(nèi)置的函數(shù),方便操作。
如:
SELECT SYSDATE FROM dual;
SELECT seq.nextval FROM dual;

簡單來說,dual表就是oracle與數(shù)據(jù)字典自動創(chuàng)建的一張表,這張表是一個單行單列的表,這個表只有1列:DUMMY,數(shù)據(jù)類型為VERCHAR2(1),dual表中只有一個數(shù)據(jù)'X', Oracle有內(nèi)部邏輯保證dual表中永遠(yuǎn)只有一條數(shù)據(jù)。dual表主要是用來選擇系統(tǒng)變量或是求一個表達(dá)式的值。
比如:
--求系統(tǒng)當(dāng)前時間
SELECT sysdate FROM daul
--求系統(tǒng)當(dāng)前時間,并按設(shè)定的格式顯示
select to_char(sysdate,''yyyy-mm-dd hh24:mi:ss'') from dual;
--當(dāng)計(jì)算器使用
select 1+2 from dual

dummy:虛設(shè)






序列就是用來實(shí)現(xiàn)自動增長的,索引就是用來快速查找信息的。



個人認(rèn)為序列是用來查不重復(fù)數(shù)據(jù)用的,比如id列。
同義詞就是別名,是表的列名的別名,類似于我之前使用SQLServer時遇到的“虛擬列”,
或是對象的別名,比如用戶的別名。

--給emp表創(chuàng)建一個別名(同義詞)
--sys賬號登錄
create public synonym a for j190802.emp;
--刪除同義詞
drop public synonym a;
--j190802賬號登錄
select * from a;
【當(dāng)然,我習(xí)慣用dba管理員進(jìn)行創(chuàng)建表,起別名等的操作,上面的代碼的話就是
用sys這個管理員身份的賬號給普通身份的j190802中創(chuàng)建的表起別名,之后退出sys賬號,
用j190802來查看起別名是否生效?!?/p>
synonym:同義詞

個人對sequence序列,索引,synonym同義詞的理解 END
個人對表級鎖的理解 START

個人對表級鎖的理解 END
個人對事物的一致性的理解 START

個人對事物的一致性的理解 END
為什么使用insert語句時要點(diǎn)一個綠色按鈕來提交事物的原因 START


為什么使用insert語句時要點(diǎn)一個綠色按鈕來提交事物的原因 END
作業(yè) START
分頁查詢,序列等的作業(yè) START
?
?1、創(chuàng)建一個寵物表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、創(chuàng)建一個寵物類型表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);
外鍵規(guī)律:
【個人總結(jié):有主鍵的放references后面比如ptype表中的id有主鍵】
4、給ptype表創(chuàng)建一個名為pt的同義詞。
答:
create public synonym pt for ptype;
測試是否成功創(chuàng)建同義詞:
select * from pt
5、通過創(chuàng)建序列往兩個表中插入至少三條數(shù)據(jù)
create sequence seq_ptype
start with 1? ? ? ?--起始值是1
increment by 1? ? ?--增長的值? ?
maxvalue 999999999 --序列號的最大值
minvalue 1? ? ? ? ?--序列號的最小值
nocycle? ? ? ? ? ? --是否循環(huán)
cache 10;? ? ? ? ? --預(yù)存
--select * from ptype
----select seq_ptype.nextval from ptype;【暫時不用】
--select seq_ptype.nextval from dual;【dual是oracle與數(shù)據(jù)字典自動創(chuàng)建的單行單列的表】
--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? ? ? ? ? ? --是否循環(huán)
cache 10;? ? ? ? ? --預(yù)存
--查詢表的內(nèi)容:
--select * from pet
--查詢表的內(nèi)容:
--select * from ptype
--激活序列號:
--select seq_pet.nextval from dual;(用dual代替pet)
--查詢當(dāng)前序列號最大值:
--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、創(chuàng)建一個視圖,查詢這個視圖可以看到寵物的name,color,age和typename屬性。
--創(chuàng)建一個名為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表查詢語句為短短的一句,我發(fā)現(xiàn)”封裝“很常用,也的確是減少
--重復(fù),進(jìn)而高效,個人認(rèn)為”封裝“就是編程代碼的核心思想,有了這個思想,
--才出現(xiàn)編程】
select * from petAndPtype;
7、對Pet表進(jìn)行分頁查詢:
每頁顯示3條數(shù)據(jù),顯示第2頁的數(shù)據(jù)
每頁顯示10條數(shù)據(jù),顯示第1頁的數(shù)據(jù)
--rows=3,page=2【自己使用前把公式寫前面就可以快速算出rownum在不同位置的取值
--這個寫公式在前面,類似寫公式等規(guī)律在前面,給公式賦值做數(shù)學(xué)題或按照其他
--規(guī)律做事時更高效】
--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
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? 分頁查詢,序列等的作業(yè) END?

作業(yè) END
代碼參考例子 START
--創(chuàng)建銀行賬戶表
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);
--轉(zhuǎn)賬功能
update bank set balance = balance - 2000 where id = 1;
update bank set balance = balance + 2000 where id = 2;
--提交事務(wù)
commit;
--回滾事務(wù)
--rollback;
--給emp表創(chuàng)建一個別名(同義詞)
--sys賬號登錄
create public synonym a for j190802.emp;
--刪除同義詞
drop public synonym a;
--j190802賬號登錄
select * from a;
--序列,實(shí)現(xiàn)自動增長的列
--創(chuàng)建一個序列
create sequence seq_userinfo
start with 1? ? ? ?--起始值是1
increment by 1? ? ?--增長的值? ?
maxvalue 999999999 --序列號的最大值
minvalue 1? ? ? ? ?--序列號的最小值
nocycle? ? ? ? ? ? --是否循環(huán)
cache 10;? ? ? ? ? --預(yù)存
--激活序列號
select seq_userinfo.nextval from dual;
--查看當(dāng)前的序列號
select seq_userinfo.currval from dual;
--使用序列號實(shí)現(xiàn)自動增長的列的功能
insert into userinfo values(seq_userinfo.nextval,
'測試123',666,sysdate);
insert into userinfo values(seq_userinfo.nextval,
'test123',555,sysdate);
--sys賬號登錄
--授予j190802賬號創(chuàng)建視圖的權(quán)限
grant create view to j190802;
--j190802賬號登錄
--創(chuàng)建一個名為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