MySQL數據庫06(事務、視圖、索引、備份和恢復)

一、事務

1.定義

MySQL 事務主要用於處理操作量大,複雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!

事務(TRANSACTION)是作爲單個邏輯工作單元執行的一系列操作

多個操作作爲一個整體向系統提交,要麼都執行,要麼都不執行

事務是一個不可分割的工作邏輯單元

在MySQL中只有使用了Innobd數據庫引擎的數據庫或表才支持事務

失誤用來管理insert,update,delete語句

2.事務必須具備以下四個屬性,簡稱ACID屬性

原子性(Atomicity)事務是一個完整的操作,事物的各步操作是不可分的(原子的),要麼都執行,要麼都不執行

一致性(Consistency)當事務完成時,數據必須處於一致狀態

隔離性(Isonlation)併發事務之間彼此隔離,它不應以任何方式依賴於或影響其他事務

持久性(Durability)事務完成後,它對數據庫的修改被永久保持

3.事務控制語句

控制語句作用
BEGIN或START TRANSACTION;
顯式 開啓一個事務;
COMMIT;

也可以使用COMMIT WORK,不過二者是

等價的。COMMIT會提交事務,並使已對數

據庫進行的所有修改稱爲永久性的;

ROLLBACK;

有可以使用ROLLBACK WORK,不過二者

是等價的。回滾會結束用戶的事務,並撤銷

正在進行的所有未提交的修改;

SAVEPOINT identifier;

SAVEPOINT允許在事務中創建一個保存點,

一個事務中可以有多個SAVEPOINT;

RELEASE SAVEPOINT identifier;

刪除一個事務的保存點,當沒有指定的保存點

時,執行該語句會拋出一個異常;

ROLLBACK TO identifier;
把事務回滾到標記點;
SET TRANSACTION;

用來設置事務的隔離級別。InnoDB存儲引擎提

供事務的隔離級別有READ UNCOMMITTED、

READ COMMITTED、REPEATABLE READ和SERIALIZABLE。


4.MySQL事務處理主要有兩種方法:

<1>用BEGIN,ROLLBACK,COMMIT來實現

BEGIN開始一個事務 

ROLLBACK事務回滾 

COMMIT 事務確認 

<2>直接用SET 來改變MySQL的自動提交模式

默認情況下,每條單獨的SQL語句是爲一個事務

關閉默認提交狀態後,可手動開啓 關閉事務

SET AUTOCOMMIT-0禁止自動提交

SET WUTOCOMMIT-1開啓自動提交

關閉自動提交後,從下一條SQL語句開始則開啓新事務,需使用COMMIT或ROLLBACK語句結束該事務

練習:

模擬實現轉賬

<1>先創建表添加數據

假定張三的賬戶1000元,李四賬戶有1元

 
CREATE TABLE `bank`
(
    `customerName` CHAR(10), #用戶名 	
    `currentMoney` DECIMAL(10,2)  #當前餘額   	
);
/*插入數據*/
INSERT INTO `bank`(`customerName`,`currentMoney`) 
     VALUES('張三',1000);
INSERT INTO `bank`(`customerName`,`currentMoney`) VALUES('李四',1);

,<2>從張三的賬戶轉賬500元到李四的賬戶

 
#張三的賬戶減500元,李四的賬戶增500元
UPDATE `bank` SET `currentMoney`=`currentMoney`-500 
     WHERE `customerName`='張三';
UPDATE `bank` SET `currentMoney`=`currentMoney`+500 
     WHERE `customerName`='李四';

執行命令得


<3>.轉賬過程就是一個整體

它需要兩條UPDATE語句來完成,這兩條語句是一個政體,如果其中一條出現錯誤,則整個轉賬業務也應該取消,兩個賬戶中的餘額應恢復到原來的數據,從而確保轉賬錢和轉賬後的月不變.

使用事務解決轉賬問題

 
BEGIN;

	UPDATE `bank` SET currentMoney=currentMoney+500 WHERE customerName='張三';
	UPDATE `bank` SET currentMoney=currentMoney-500 WHERE customerName='李四';

ROLLBACK;#回滾事務,數據恢復到原始狀態

COMMIT;

假設中間出現問題 執行ROLLBAK命令 則回滾事務

<4>添加關閉自動提交和開啓自動提交

 
SET autocommit=0;#關閉自動提交,以下視爲一個事務
/*--轉賬:張三的賬戶減少500元,李四的賬戶增加500元--*/
UPDATE `bank` SET `currentMoney`=`currentMoney`-500 
     WHERE `customerName`='張三';
UPDATE `bank` SET `currentMoney`=`currentMoney`+500 
     WHERE `customerName`='李四';
COMMIT;#提交事務
UPDATE `bank` SET `currentMoney`=`currentMoney`-1000 WHERE `customerName`='張三';
ROLLBACK;#回滾事務
SET autocommit = 1;#開啓自動提交,恢復默認狀態

執行命令得


二、視圖

1.什麼是視圖?

視圖是一張虛擬表

    表示一張表的部分數據或多張表的綜合數據

    其結構和數據是建立在對標的查詢基礎上

視圖中不存放數據

    數據存放在試圖所引用的原始表中

一個原始表,根據不同用戶的不同需求,可以創建不同的視圖

2.用途

<1>防止未經許可的用戶訪問敏感數據

<2>降低數據庫的複雜程度

<3>將多個物理數據庫抽象爲一個邏輯數據庫

<4>篩選表中的行

3.創建視圖

<1>使用SQL語句創建視圖

語法:CREATE VIEW view_name

AS

<SELECT語句>;

<2>使用SQL語句刪除視圖

語法:DROP VIEW IF EXISTS view_name;

<3>使用SQL語句查看視圖

語法:SELECT 字段1,字段2...from view_name;

:創建班級爲1且爲男性的學生信息

 
DROP VIEW IF EXISTS vw_grad1_sexMale;#如果此視圖存在就刪除
CREATE VIEW vw_grade1_sexMale#創建視圖
AS 
SELECT * FROM student
WHERE gradeid=1 AND sex='男'#條件 一班 男性


SELECT * FROM vw_grade1_sexMale#查詢視圖

4.視圖的注意事項

<1>視圖中可以使用多個表

<2>一個視圖可以嵌套另一個視圖

<3>對視圖數據進行添加、更新和刪除操作直接影響所引用表中的數據

<4>當視圖數據來自多個表時,不允許添加和刪除數據

<5>查看所有視圖

語法:USE 數據庫

SELECT * FROM views\G;

(使用視圖修改數據會有許多限制,一般在實際開發中試圖僅用作查詢)

例:使用視圖獲取多表中數據,統計每個學生所參考課程的平均成績

 
CREATE VIEW view_student_result#創建視圖
AS
SELECT studentName,sub.subjectName,AVG(studentresult)
FROM student AS s
INNER JOIN result AS r ON s.studentNo=r.studentNo
INNER JOIN `subject` AS sub ON sub.subjectNo=r.subjectNo#三表匹配關係列
GROUP BY studentName,subjectName#按照姓名 科目分組

SELECT * FROM `view_student_result`

三、索引

1.MySQL索引的建立於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度

索引是一種有效組合數據的方式,爲快速查找到指定記錄

作用:大大提高數據庫的檢索速度,;改善數據庫性能

2.MySQL索引按存儲類型分類

    B-樹索引:InnoDB  MyISAM均支持

    哈希索引

常用索引

類型說明
普通索引

基本索引類型

允許在定義索引的列中插入重複值和空值

唯一索引索引列數據不重複
主鍵索引

主鍵列中的每個值是非空 唯一的

一個主鍵將自動創建主鍵索引

複合索引將多個列組合作爲索引
全文索引

支持值的全文查找

允許重複值和空值

空間索引對空間數據類型的列創建的索引

3.創建 刪除索引

創建索引

語法:CREATE [UNIQUE|FULLTEXT|SPATIAL]  INDES index_name

ON table_name(column[length]...)

刪除索引

語法: DROP INDEX index_name ON table_name; 

(刪除表時,該表的所有索引同時會被刪除)

:在student表的studentName列創建普通索引

 

CREATE UNIQUE INDEX ix_stuName_unique
ON student(studentName)

使用視圖多表連查

 
SELECT r.*
FROM result AS r
INNER JOIN `vw_grade1_sexmale` AS g ON g.studentNo=r.studentNo

4.創建索引的指導原則

按照下列標準選擇創立索引的列

<1>頻繁搜索的列(select 語句)

<2>經常用作查詢選擇的列(select語句)

<3>經常排序 分組的列(order by / group by)

<4>經常用作連接的列(inner join 語句)

請不要使用下面的列創建索引

<1>僅包含幾個不同值的列

<2>表中僅包含幾行

5.使用索引時注意事項

<1>查詢時減少使用*返回全部列,不要返回不需要的列

<2>索引應該儘量小,在字節數小的列上建立索引

<3>WHERE字句中有多個條件表達式時,包含索引列的表達式應置於其他條件表達式之前

<4>比表ORDER BY子句中使用表達式

6.查看索引

語法:SHOW INDEX FROM table_name;

例;查看python7數據庫中全部索引信息

 
USE python7;
SHOW INDEX FROM student\G;

執行命令得


Table:創建索引的表
Non_unique:索引是否非唯一
Key_name:索引的名稱
Column_name:定義索引的列字段
Seq_in_index:該列在索引中的位置
Null:該列是否能爲空值

Index_type:索引類型

四、備份數據庫

1.爲什麼進行數據庫備份

 數據庫故障  突然斷電 病毒入侵 誤操作導致數據丟失....

2.備份數據庫

1.mysqldunmp命令---MySQL一個常用的備份工具

        將CREATE和INSERTINTO語句保存到文本文件

        屬於DOS命令

語法:


(注意: mysqldump是DOS系統下的命令,在使用時無需進入mysql命令行,否則將無法執行)

示例:使用root賬戶登錄到MySQL服務器,備份python7數據庫下的student

 
mysqldump -u root -p python7 student > d:python項目\student_info.sql

(注意:爲保證賬戶密碼安全,命令中可不寫密碼,但參數"-p"必須寫,回車後根據提示寫密碼)

2.常用參數選項

參數描述
-add-drop-table
在每個CREATE TABLE語句前添加DROP TABLE語句,默認是打開的,可以用-skip-add-drop-table來取消
--add-locks
該選項會在INSERT 語句中捆綁一個LOCK TABLE 和UNLOCK TABLE 語句
好處:防止記錄被再次導入時,其他用戶對錶進行的操作
-t或-no-create-info
只導出數據,而不添加CREATE TABLE語句
-c或--complete-insert
在每個INSERT語句的列上加上列名,在數據導入另一個數據庫時有用
-d或--no-data
不寫表的任何行信息,只轉儲表的結構

3.備份文件包含的主要信息

<1>備份後文件包含信息MySQL及mysql工具版本號

<2>備份賬戶的名稱

<3>主機信息

<4>備份的數據庫名稱

<5>SQL語句註釋和服務器相關注釋

<6>CREQTE 和 INSERT 語句

五、恢復數據庫

1.使用mysql命令恢復數據庫

語法:

(注意:<1>mysql爲DOS命令

        <2>在執行該語句之前,必須在MySQL服務器中創建新的數據庫,如果不存在恢復數據庫活成將會出錯)

示例:使用備份文件將python7數據庫中的student表信息恢復到python8數據庫中


2.使用source命令恢復數據庫

語法: source filname;

注意:登錄MySQL服務後使用  執行該命令前,先創建並選擇恢復後的目標數據庫

 
CREATE DATABASE python8;#創建數據庫
USE python8;#選擇數據庫
source d:\python項目\student_info.sql#恢復數據庫

3.通過複製文件實現數據備份和恢復

<1>直接賦值MySQL數據庫的儲存目錄及文件進行備份

優點:操作簡單

缺點:複製數據前停止服務

        不適合InnoDS數據庫

        MySQL版本不同步兼容

注意:此方法不是最優的數據庫備份和恢復方案

<2>表數據導出到文本文件

導出/導入數據---可實現數據庫服務器移動數據

導出

語法:

SELECT * FROM table_name

WHERE contion

INTO OUTFILE "導出的目標文件" [OPTION]

示例:

將試圖vw_grade1_sexmale中的信息導出到文本文件

 
SELECT studentNO FROM  `vw_grade1_sexmale`)
INTO OUTFILE 'D:/python項目/exam1.txt'

導入

語法:

LOAD DATA INFILE '目標文件' INTO TABLE 

table_name[OPTION]

示例:

將數據從文本文件導入到python7的student表

 
LOAD DATA INFILE 'D:/Pictures/exam1.txt'
INTO TABLE `student`
注意:導入數據前應確保目標已存在!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章