從0學習MySQL系列(三)概念篇
概要
在篇文章中提過:概念:資料庫管理系統(Database Management System)一些語法的彙總點。
增刪改查是基本的操作語法。對於一些概念,主鍵,外來鍵,表,事務,鎖,儲存過程,檢視,觸發器,分割槽等概念,請參考上面的文章。概念是晦澀難看,但是有時候又忍不住多看幾眼。
內容:主鍵,外來鍵,檢視,儲存過程,觸發器,事務,鎖。
主外來鍵
使用表:Department,Employee
主鍵是唯一標識一張表的資料,不允許為NULL,不允許重複,保證了資料的完整性。
外來鍵是另一張表的主鍵,外來鍵可以為NULL,可以有重複,與其他表建立聯絡。
圖中有兩個表,分別是:Department,Employee表,其中,DeptID、EmpID分別是這兩個表的主鍵,DeptID是Employee表的外來鍵。
程式碼:
create database DB_Company; use DB_Company; -- 建立Department 部門表 create table Department( DeptID int primary key auto_increment not null, DeptName varchar(20) not null, Description varchar(100) ) -- 建立員工表 create table Employee ( EmpID int primary key auto_increment not null, EmpName varchar(10) not null, Gender varchar(4) not null, Age int(2) not null, foreign key(EmpID) references Department(DeptID) )
檢視
建立檢視,檢視是一種虛擬存在的表,對於使用檢視的使用者來說是透明的。檢視具有簡單、安全、資料獨立等優點。
建立檢視employee_view的語法:
create or replace view employee_view as select * from Employee
MySQL檢視的定義有一些限制。from後面不能包含子查詢。如果輸入是從別的資料庫遷移過來的,可以先將子查詢的內容定義為檢視。
另外,包含聚合函式(SUM(),MIN(),MAX(),COUNT())、DROUP BY、HAVING、UNION等的檢視不可更新。
包含常量檢視,Select中包含子查詢的,JION連線查詢的檢視都是不可更新的。
drop view employee_view; -- 刪除檢視
檢視檢視,從MySQL5.1版本以上,沒有show views 這個檢視檢視的命令了,使用show table status
show table status like "employee_view"
-- 如果要查詢employee_view檢視的定義
show create view employee_view
儲存過程
什麼是儲存過程呢?什麼是函式呢?儲存過程和函式,其實是事先經過編譯的、並存儲在資料庫中的一段SQL語句的集合。
函式嘛,要有返回值,而儲存過程不需要返回值。儲存過程的引數可以使用IN,OUT,INOUT,但是函式只能用IN型別的。
儲存過程中可以執行提交,或者是回滾。提交即確認之前的修改,回滾即放棄之前的修改。儲存過程不允許執行LOAD DATA INFILTE 語句,此外,儲存過程可以呼叫其他的儲存過程。
create procedure employee_in_stock(in EmpID int, in EmpName varchar,
in Gender varchar, in Age int)
Reads SQL Data
BEGIN
......
......
.......
END
直接執行SQL和呼叫儲存過程的效果是一樣的,使用儲存過程的優點在於處理邏輯封裝在資料庫中,呼叫的時候不需要知道真正去了解中間的處理邏輯。即使中間的邏輯發生了變化,修改即可,對程式沒有預知內的影響。其餘知識點不贅述。(包括變數的使用、流程的控制、時間排程器、儲存過程的刪除等)
事務
事務具有四種性質:
原子性:一組事務,要麼成功;要麼撤回。
穩定性 : 有非法資料(外來鍵約束之類),事務撤回。
隔離性:事務獨立執行。一個事務處理後的結果,影響了其他事務,那麼其他事務會撤回。事務的100%隔離,需要犧牲速度。
可靠性:軟、硬體崩潰後,InnoDB資料表驅動會利用日誌檔案重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定什麼時候吧事務儲存到日誌裡。
索引
MySQL索引。首先,MySQL的索引是在儲存引擎層面實現的,並不是在伺服器層面實現的。所以每一種的儲存引擎的索引都是不是完全相同的。MySQL目前提供了一下4種索引。
B-Tree索引:最常見的搜尋引擎。大部分的搜尋搜尋引擎是支援B-Tree。
Hash索引:這個搜尋引擎只有Memory引擎支援。
R-Tree索引:又稱為空間索引。空間索引要是MyISAM的一個特殊搜尋引擎。
Full-text:全文索引。全文索引也是MyISAM的一個特殊的索引型別。InnoDB 從MySQL 5.6版本開始提供了對全文的支援。
三種引擎對四種索引的支援情況
索引 |
MyISAM引擎 |
Memory引擎 |
InnoDB引擎 |
---|---|---|---|
B-Tree |
Y |
Y |
Y |
Hash |
N |
Y |
N |
R-Tree |
Y |
N |
N |
Full-text |
Y |
N |
N |