一、事務
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`
注意:導入數據前應確保目標已存在!