-----事務(wù)處理
在數(shù)據(jù)庫(kù)中跷坝,事務(wù)由一組相關(guān)的DML或select語(yǔ)句杨凑,加上一個(gè)TPL語(yǔ)句(commit ,rollback)或一個(gè)DDL語(yǔ)句(create,alter,drop,truncate等)或一個(gè)DCL(grant,revoke)語(yǔ)句
事務(wù)特征可用四個(gè)字母的縮寫表示:即ACID
--原子性(atomicity)
事務(wù)就像原子一樣魔熏,不可被分割。組成事務(wù)的DML操作語(yǔ)句要么全成功蹄胰,要么全失敗,不可能出現(xiàn)部分成功部分失敗的情況
--一致性(Consistency)
一旦事務(wù)完成,不管是成功的赡勘,還是失敗的,整個(gè)系統(tǒng)處于數(shù)據(jù)一致的狀態(tài)
--隔離性(Isolation)
一個(gè)事務(wù)的執(zhí)行不會(huì)被另一個(gè)事務(wù)所干擾捞镰。比如兩個(gè)人同時(shí)從一個(gè)賬戶中取錢闸与,通過事務(wù)的隔離性確保賬戶余額的正確性
--持久性(durability)
也稱為永久性,指事務(wù)一旦提交岸售,對(duì)數(shù)據(jù)的改變就是永久的践樱,不可能再被回滾。
----MySQL的事務(wù)處理主要有兩種方法
--1.用begin,rollback,commit來(lái)實(shí)現(xiàn)
begin開始一個(gè)事務(wù)
rollback事務(wù)回滾
commit 事務(wù)提交
--2.直接用set來(lái)改變MySQL的自動(dòng)提交模式
MySQL默認(rèn)是自動(dòng)提交的凸丸,也就是你提交一個(gè)sql拷邢,就直接執(zhí)行!可以通過
show variables like '%autocommit%'查看自動(dòng)事務(wù)
set autocommit =0或者off 禁止自動(dòng)提交
set autocommit =1或者on 開啟自動(dòng)提交
來(lái)實(shí)現(xiàn)事務(wù)的處理
但要注意當(dāng)用set autocommit =0 的時(shí)候屎慢,以后所有的sql都將作為事務(wù)處理瞭稼,直到用commit確認(rèn)或rollback結(jié)束忽洛,注意當(dāng)結(jié)束這個(gè)事務(wù)的同時(shí)也開啟了新的事務(wù)!按第一種方法只將當(dāng)前的做為一個(gè)事務(wù)
----隱式結(jié)束
--隱式提交
當(dāng)下列任意一種情況發(fā)生時(shí)环肘,會(huì)發(fā)生隱式提交
-執(zhí)行一個(gè)DDL(create,alter,drop,truncate,rename)語(yǔ)句
-執(zhí)行一個(gè)DCL(grant,revoke)語(yǔ)句欲虚;
--隱式回滾
當(dāng)下列任意一種情況發(fā)生時(shí),會(huì)發(fā)生隱式回滾
客戶端強(qiáng)行退出
客戶端連接到服務(wù)器端異常中斷
系統(tǒng)崩潰
---設(shè)置保存點(diǎn)
如果在一個(gè)事務(wù)內(nèi)悔雹,想要回滾到指定位置复哆,不是回滾到事務(wù)的起始點(diǎn),可以通過保存點(diǎn)(savepoint)來(lái)實(shí)現(xiàn)
savepoint savepointname 定義一個(gè)保存點(diǎn)語(yǔ)句
rollback to savepointname 回滾到指定保存點(diǎn)
練習(xí)練習(xí)
insert into dept values(103,'錢如','沈陽(yáng)');
show variables like'%autocommit%';
set autocommit =off;--關(guān)閉自動(dòng)事務(wù)
begin;--開始事務(wù)操作
insert into dept values(107,'錢如你我','沈陽(yáng)');
commit;提交 如果用rollback 就是回滾到最開始
savepoint sp1;設(shè)置保存點(diǎn)回滾點(diǎn)
insert into dept values(108,'錢你我','沈陽(yáng)');
rollback to sp1;撤銷操作到spl保存點(diǎn)
commit腌零;將所有修改寫入數(shù)據(jù)庫(kù)
rollback;這里操作不行了因?yàn)椴僮饕呀?jīng)commit,不能回滾了
start transaction;手動(dòng)開啟事務(wù) 相當(dāng)于begin
------視圖
視圖是邏輯上來(lái)自一個(gè)或者多個(gè)表的數(shù)據(jù)集合
--為什么使用視圖
-限制其它用戶對(duì)數(shù)據(jù)庫(kù)的訪問,因?yàn)橐晥D可以有選擇性的現(xiàn)實(shí)數(shù)據(jù)庫(kù)表的一部分
-容易實(shí)現(xiàn)復(fù)雜的查詢
-對(duì)于相同的數(shù)據(jù)可以產(chǎn)生不同的視圖
-----創(chuàng)建視圖
創(chuàng)建視圖語(yǔ)法:
create [or replace]
view view_name[(column_list)]
as select_statement;
or replace 如果所創(chuàng)建的視圖已經(jīng)存在寂恬,該選項(xiàng)表示修改原視圖的定義
view_name 視圖的名稱
column_list 列名,列名的數(shù)量必須和視圖所對(duì)應(yīng)查詢語(yǔ)句的列數(shù)量相等
select_statement 一條完整的select語(yǔ)句
例子:
create view salvu
as select empno EMPNO ,ename ENAME ,sal SALARY
from emp
where deptno=30;
從視圖檢索數(shù)據(jù)
從視圖中檢索數(shù)據(jù)莱没,同從表中檢索數(shù)據(jù)一樣初肉,只不過是只能看到視圖所定義的那些列
修改視圖
create or replace view 子句修改視圖emp 為每個(gè)列添加別名
create view 子句中別名的順序必須和內(nèi)部查詢中的列的順序一一對(duì)應(yīng)
--視圖上執(zhí)行DML操作
可以通過視圖向基表插入數(shù)據(jù),只要視圖中不出現(xiàn)以下情況1.group 函數(shù)2.group by子句3.distinct 關(guān)鍵字
可以通過視圖修改基表中數(shù)據(jù)饰躲,只要視圖中不出現(xiàn)以下情況:1.group 函數(shù) group by子句牙咏,distinct關(guān)鍵字2.使用表達(dá)式定義的列
可以通過視圖向基表插入數(shù)據(jù),只要視圖中不出現(xiàn)以下情況:1.group函數(shù)嘹裂,group by 子句妄壶,distinct 關(guān)鍵字2.使用表達(dá)式定義的列3.基表中未在視圖中選擇的其它列定義為非空并且沒有默認(rèn)值
---刪除視圖
刪除視圖并不會(huì)刪除數(shù)據(jù),因?yàn)橐晥D是基于數(shù)據(jù)庫(kù)中的基表的虛表
------索引
索引是一種特殊的數(shù)據(jù)庫(kù)結(jié)構(gòu)寄狼,可以用來(lái)快速查詢數(shù)據(jù)庫(kù)表中的特定記錄丁寄。索引是提高數(shù)據(jù)庫(kù)性能的重要方式。
MySQL中泊愧,所有的數(shù)據(jù)類型都可以被索引
----創(chuàng)建索引是指在某個(gè)表的一列或多列上建立一個(gè)索引伊磺,以便提高對(duì)表的訪問速度。創(chuàng)建索引的三種方式删咱,這三種方式分別是:
-創(chuàng)建表的時(shí)候創(chuàng)建索引
-在已經(jīng)存在的表上創(chuàng)建索引
-使用alter table 語(yǔ)句來(lái)創(chuàng)建索引
例子:
普通索引
create table index1(
id int,
name varchar(20),
sex boolean,
index(id)
);
創(chuàng)建唯一性索引
create table index2(
id int unique,
name varchar(20),
unique index index2_id(id asc)
);
創(chuàng)建全文索引只能創(chuàng)建在char,varchar或text類型的字段上屑埋,而且,現(xiàn)在只有MyISAM存儲(chǔ)引擎支持全文索引
create table index3(
id int,
info varchar(20),
Fulltext index index3_info(info)
)engine=myisam;
使用多列索引時(shí)一定要特別注意痰滋,只有使用了索引中的第一個(gè)字段時(shí)才會(huì)觸發(fā)索引摘能。如果沒有使用索引中的第一個(gè)字段,那么這個(gè)多列索引就不會(huì)起作用
在已經(jīng)存在的表上敲街,可以通過Alter table 語(yǔ)句直接為表上的一個(gè)或者幾個(gè)字段創(chuàng)建索引团搞。
alter table 表名 add
[unique | fulltext|spatial]index
索引名(屬性名[(長(zhǎng)度)asc|desc]);
刪除索引
drop index 索引名 on 表名;