常見數據庫對象(視圖、索引、觸發器、事務)


一、視圖

1.1 視圖的定義

  視圖是指計算機數據庫中的視圖,是一個虛擬表,其內容由查詢結果來定義。同真實的表一樣,視圖包含一系列帶有名稱的行和列數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。如果基表中的數據發生變化,則從視圖中查詢出的數據也隨之變化。

1.2 視圖的優點

(1)定制用戶數據

  每個組織都有不同角色的工作人員,以銷售公司為例,采購人員需要一些與采購有關的數據,而與采購無關的數據,對采購人員沒有任何意義。可以根據這一實際情況,專門為采購人員創建一個視圖,以后采購人員在查詢數據時,只需執行“select * from 采購視圖”就可以了。

(2)簡化數據操作

  在使用查詢時,很多時候需要使用聚合函數,同時還要顯示其他字段的信息,可能還會關聯到其他表,這時寫的SQL語句會很長,如果這個多做頻繁發生的話,就可以通過創建視圖,簡化數據來查詢。

(3)細粒化的安全機制

  因為視圖是虛擬的,物理上是不存在的,它只是存儲了數據的集合。因此,可以將基表中重要的字段信息不通過視圖提供給用戶。視圖是動態的數據的集合,數據是隨着基表的更新而更新的。同時,用戶不可以隨意地更改和刪除視圖,以保證數據的安全性。

(4)合並分離的數據

  隨着社會的發展,公司的業務量不斷地擴大。為了管理方便,對於設有很多分公司的大公司,需要統一表的結構,從而定期查看各個分公司的業務情況。使用union關鍵字,可以將各分公司的數據合並為一個視圖,這樣既方便又高效。

1.3 視圖的創建和使用

語法:

  create view view_name as select column_name(n) from table_name(n) where condition

說明:

  view_name:視圖名

  column_name(n):視圖中的字段列表,可以來源於多個表

  table_name(n):表名,可以來源於多個表

  condition:條件表達式,如果是多個表,則該表達式還包含標的連接條件

二、索引

2.1 索引的基本知識

  2.1.1 理解索引

  2.1.2 索引工作的原理

  2.1.3 索引的作用

  2.1.4 索引的優缺點

     優點:

       (1)大大加快了數據的檢索速度。

       (2)創建唯一性索引,保證數據庫表中每一行數據的唯一性。

       (3)加速表和表之間的連接。

       (4)在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。

     缺點:

       (1)索引需要占用物理空間。

       (2)當對表中的數據進行增加、刪除和修改時,數據庫系統需要對索引進行動態維護,降低了數據的維護速度。

  2.1.5 使用索引的場合

     由於在創建、使用索引時,會損失一定的系統性能,所以在工程實踐中需綜合考慮性能與效率,決定是否創建索引,以及在哪些列上創建索引。一般情況下,可依據以下幾個標准創建索引:

       (1)在經常需要搜索的列上,可以加快搜索的速度。

       (2)在作為主鍵的列上。

       (3)經常用在連接的列上,這些列主要是一些外鍵,在這些列上建立索引可以加快連接的速度。

       (4)在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的。

       (5)在經常需要排序的列上創建索引,這樣查詢可以利用索引的排序,節省排序查詢的時間。

       (6)在使用where子句的列上創建索引,加快條件的判斷邏輯。

     一般而言,不應該創建索引的列具有下列特點:

       (1)對於那些在查詢中很少使用或參考的列不應該創建索引。因為既然這些列很少被使用,所以是否有索引並不能影響查詢速度。相反,由於增加了索引,反而降低了系統的維護速度且增大了空間需求。

       (2)對於那些只有很少數據值的列而言,同樣不應該增加索引。因為由於這些列的取值很少,在查詢的結果中,結果集的數據行占了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加索引,並不能明顯加快檢索速度。

       (3)對於那些定義為text、image和bit數據類型的列不應該增加索引。因為這些列的數據量要么相當大,要么取值很少。

       (4)當修改性能遠大於檢索性能時,不應該創建索引。因為修改性能和檢索性能時互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。但是當減少索引時,會提高修改性能,降低檢索性能。

2.2 索引分類

(1)常規索引

  常規索引(Regular Index,也稱普通索引),它可以常規地提高查詢效率。一張數據表中可以有多個常規索引。常規索引是使用最普遍的索引類型,如果沒有明確指明索引的類型,一般所說的索引都是常規索引。

(2)主鍵索引

  主鍵索引(Primary Key,也稱主鍵)可以提高查詢效率,並提供唯一性約束。一張表中只能有一個主鍵,被標志為自動增長的字段一定是主鍵,但主鍵不一定是自動增長。

(3)唯一索引

  唯一索引(Unique Key)可以提高查詢效率,並提供唯一性約束。一張表中可以有多個唯一索引。

(4)全文索引

  全文索引(Full Text,也稱全文索引)是目前搜索引擎使用的一種關鍵技術。它能夠利用分詞技術等多種算法智能分析出文本文字中關鍵字詞的頻率及重要性,然后按照一定的算法規則智能地篩選出我們想要的搜索結果。雖然使用like關鍵字可以實現模糊匹配,但這僅適用於文本體量較少的情況,對於文本體量較大的檢索是不可想象的。對於大體量文本的檢索,全文索引的查詢速度比like模糊查詢快了幾個數量級,但是全文索引可能存在精度問題。

(5)外鍵索引

  外檢索引(Foreign Key)可以提高查詢效率。外鍵字段如果沒有指定索引名稱,會自動生成。外鍵會自動和對應的其他表的主鍵關聯,它的主要作用是保證記錄的一致性和完整性。(只有InnoDB存儲引擎的表才支持外鍵,5.6機器以上版本的MySQL的默認存儲引擎就是InnoDB)

(6)復合索引

  復合索引是指一個索引中包含多個列,復合索引也稱多列索引或組合索引。索引列既可以為單個列,也可以為多個列。(如果在多個列上分別創建了索引,MySQL會試圖選擇一個限制最嚴格的索引。但是,即使是限制最嚴格的單列索引,它的限制能力也肯定遠低於在多個列上所創建的復合索引,所以在多個列上創建復合索引的檢索效率要高於分別在這些列上創建單個索引的檢索效率)

2.3 創建索引

(1)使用 “alter 表 add 索引” 命令創建索引

  語法:

    1、alter table table_name add index index_name (column_list)

    2、alter table table_name add unique index_name (column_list)

    3、alter table table_name add primary key (column_list)

  說明:

    1、分別創建普通索引、唯一索引和主鍵索引。

    2、table_name為需要增加索引的表名。

    3、column_list指出對哪些列進行索引,多列時各列之間用逗號分隔。

    4、索引名index_name可選,缺省時,MySQL將根據第一個索引列賦一個名稱。

(2)使用 “create 索引”命令創建索引

  語法:

    1、create index index_name on table_name (column_list)

    2、create unique index index_name on table_name (column_list)

  說明:

    1、索引名為必須項。

    2、不能使用create index語句創建主鍵索引。

(3)使用drop命令和alter命令刪除索引

  語法:

    1、drop index index_name on table_name

    2、alter table table_name drop index index_name 

三、觸發器

3.1 觸發器簡介

  3.1.1 觸發器概述

    觸發器是MySQL5.0新增的功能。數據庫觸發器定義了一系列操作,這一系列操作稱為觸發程序,當觸發事件發生時,觸發程序會自動進行。

    觸發器是和表關聯的特殊的存儲過程,可以在插入、刪除、修改表中的數據時觸發執行,比數據庫本身標准的功能有更精細和更復雜的數據控制能力。

    觸發器主要用於監視某個表的insert、update以及delete等數據維護操作,這些維護操作可以分別激活該表的insert、update、delete類型的觸發程序運行,從而實現數據的自動維護。觸發器可以實現的功能包括:使用觸發器實現檢查約束、維護冗余數據以及維護外鍵列數據等。

  3.1.2 觸發器優點

    1)安全性

      觸發器可以基於數據庫的值使用戶具有操作數據庫的某種權利;基於時間來限制用戶的操作,例如,不允許下班后和節假日修改數據庫數據;基於數據庫中的數據來限制用戶的操作,例如,不允許股票價格的升幅一次超過10%。

    2)審計

      觸發器可以跟蹤用戶對數據庫的操作;審計用戶操作數據庫的語句;把用戶對數據庫的更新寫入審計表。

    3)實現復雜的數據完整性規則

      觸發器可以實現非標准的數據完整性檢查和約束。觸發器可產生比規則更為復雜的限制。與規則不同,觸發器可以引用列或數據庫對象。

    4)實現復雜的非標准的數據庫相關完整性規則

      觸發器可以對數據庫中相關的表進行連環更新,這些連環更新包括一下集中典型場景:

      1.在修改或刪除時級聯修改或刪除其他表中的與之匹配的行。

      2.在修改或刪除時把其他表中的與之匹配的的行設成null值。

      3.在修改或刪除時把其他表中的與之匹配的行級聯設成缺省值。

      4.觸發器能夠拒絕或回退那些破壞相關完整性的變化,取消試圖進行數據更新的事務。

    5)同步實時地復制表中的數據

    6)提供了運行計划任務的另一種方法

3.2 定義觸發器

語法:

  create trigger 觸發器名 觸發時間 觸發事件 on 表名 for each row

  begin

    觸發程序

  end;

說明:

  1、觸發器是數據庫對象,因此創建觸發器時,需要指定該觸發器隸屬於哪個數據庫。

  2、觸發器是基於基表的,不能基於臨時表和視圖。

  3、MySQL的觸發事件有3種:insert、update和delete。

  4、觸發器的觸發時間有兩種:before和after。before表示在觸發事件發生之前執行觸發程序,after表示在觸發事件發生之后執行觸發程序。通常一個數據庫最大可以設置6中類型的觸發器,即before insert、before update、before delete、after insert、after update和after delete。

  5、for each row表示行級觸發器。for each row表示更新(insert、update和delete)操作影響的每一條記錄都會執行一次觸發程序。通常使用“表名_觸發事件_觸發時間_trigger”定義觸發器名字(如:product_insert_before_trigger)。

  6、觸發程序中可以使用old關鍵字和new關鍵字。

    1)當向表中插入新紀錄時,在觸發器程序中可以使用new關鍵字表示新紀錄。當需要訪問新紀錄的某個字段值時,可以使用“new.字段名”的方式訪問。

    2)當從表中刪除某條記錄時,在觸發器程序中可以使用old關鍵字表示舊記錄。當需要訪問舊記錄的某個字段值時,可以使用“old.字段名”的方式訪問。

    3)當修改表的某條記錄時,在觸發器程序中可以使用old關鍵字表示修改前的舊記錄,使用new關鍵字表示修改后的新記錄。當需要訪問舊記錄的某個字段時,可以使用“old.字段名”的方式訪問;當需要訪問新紀錄的某個字段值時,可以使用“new.字段名”的方式訪問。

    4)old記錄僅是只讀的,只可以引用它,而不能更改它。

四、數據庫事務

4.1 事務概述

  事務是一個由用戶所定義的完整的工作單元,一個事務內的所有語句作為一個整體來執行,或者全部執行,或者全部不執行。當遇到錯誤時,可以回滾事務,取消事務內所做的所有改變,從而保證數據庫中數據的一致性和可恢復性。

4.2 事務特性

  數據庫事務有四大特性,簡稱ACIP,分別如下:

  (1)原子性(atomic、atomicity)

    事務必須是一個原子工作單元。對於其數據修改,或者全部執行,或者全都不執行。通常與某事務相關聯的操作具有共同的目標,並且是相互依賴的。如果系統僅執行這些操作的一個子集,則可能會破壞事務的總體目標,原子性消除了系統處理操作子集的可能性。

  (2)一致性(consistent、consistency)

    事務完成時,必須使所有的數據都保持一致的狀態,即事務執行的結果必須使使數據庫從一個一致性狀態轉換為另一個一致性狀態。

  (3)隔離性(isolation)

    由並發事務所做的修改必須與任何其他並發事務所做的修改隔離。事務查看數據時,數據所處的狀態,要么是另一個並發事務修改其之前的狀態,要么是另一個事務修改其之后的狀態,事務不會查看處於中間狀態的數據。

  (4)持久性(duration、durability)

    事務完成后,其對於系統的影響是永久性的,即事務一旦完成,即使系統出現致命的故障,也將一直保持修改之后的狀態。

4.3 關閉MySQL自動提交

  默認情況下,MySQL開啟了自動提交。也就是說任意一條DML中的insert語句、update語句、delete語句,一旦發送到MySQL服務器上,MySQL服務器實例會立即解析、執行,並將新增、更新結果提交到數據庫文件中,成為數據庫中永久的數據。因此,對於諸如銀行轉賬之類的邏輯而言,首要步驟是關閉MySQL自動提交,只有當所有的SQL語句成功執行后,才提交(commit)所有的更新語句,否則回滾(rollback)所有的更新語句。

  關閉自動提交的方式有兩種:

    1)顯式地關閉自動提交

      使用MySQL命令“show variables like 'autocommit'; ”可以查看MySQL是否開啟了自動提交。系統變量 @@autocommit 的值為ON或1時,表示MySQL開啟了自動提交,默認情況下,MySQL開啟自動提交;系統變量 @@autocommit 的值為OFF或0時,表示MySQL關閉了自動提交。使用MySQL命令“set autocommit=0;”可以顯式地關閉MySQL自動提交。

    2)隱式地關閉自動提交

      使用MySQL命令“start transaction;”可以隱式地關閉自動提交,隱式地關閉自動提交不會修改系統會話變量@@autocommit的值。

4.4 MySQL事務操作語句

  start transaction:標識一個事務的開始,即啟動事務。

  commit:提交事務。標識一個事務的結束,事務內所修改的數據被永久保存到數據庫中。

  rollback:回滾事務。標識一個事務的結束,表明事務執行過程中遇到錯誤,事務內所有修改的數據被回滾到事務執行前的狀態。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM