數據庫的完整性約束

完整性約束條件的做用對象:

  • 列級約束(針對字段,key) 主要針對列的類型,取值範圍,精度等約束
    • 對空值的約束。規定某個字段是否爲空
    • 對取值範圍的約束。例如,學生成績的字段規定爲 0 - 100
    • 數據類型的約束。包括數據類型,長度,精度等。例如經常使用的定長 varchar
    • 數據格式的約束。例如,學生表中的學號 stu_no 字段,認爲規定前四位爲入學年份,後面是院系的編號等
  • 元組(或稱做 row,一條數據)約束
    • 元組中字段之間的約束。例如,一個活動的開始時間必須早於它的結束時間
  • 表級約束(外鍵)
    • 指多個元組之間,關係之間的聯繫的約束。例如,學生成績表中的 stu_no 字段,實際取值源於 學生表中的 stu_no 字段 以上是一些約束的概念,理論上的,如何實現約束,請往下看。

實體完整性

實體的完整性是經過主鍵(primary key)約束和候選鍵(candidate key)約束來實現的。因此前提條件是要了解鍵的一些概念和分類:sql

  • key:用於保證元組的惟一性數據庫

    • super-key:可以區分惟一的元組的集合
    • candidate key:super-key 中最小集
    • primary key:candidate key 中人工選擇一個(一張表只能有一個或多個組成的聯合主鍵)

    舉個例子:例若有 students 表,含有字段 stu_number(學號)id(身份證號)name(姓名) 那麼找出全部可以保證元組惟一性的super-key={{stu_number}, {id}, {stu_number, name}, {id, name}, {stu_number, id}, {stu_number, id, name}}而後可得 candidate key=stu_number 或 id數據結構

  • 主鍵約束spa

    • 每張表只能定義一個主鍵或多個主鍵組合的聯合主鍵(複合主鍵)
    • 確保可以根據主鍵查詢到惟一的元組,且不能爲 NULL,這是惟一性原則
    • 聯合主鍵不能包含沒必要要的字段。也就是說,從聯合主鍵中刪除其中一列後,還能保證惟一性,那麼是不正確的。由於要知足最小集原則
    • 一個字段只能在聯合主鍵中出現一次。由於集合的元素是惟一的
  • 建立主鍵約束線程

    • 能夠在 CREATE TABLE 或 ALTER TABLE 語句中使用 PRIMARY KEY 來實現
    • 惟一主鍵:直接在某個字段後加上關鍵字
    • 聯合主鍵:PRIMARY KEY(column_0, column_1, ...)

建立主鍵後,數據庫會自動建立惟一索引,用於對主鍵的快速查詢,索引名默認爲PRIMARY,也能夠從新自定義命名code

  • 建立候選鍵索引
  • 能夠在 CREATE TABLE 或 ALTER TABLE 語句中使用 UNIQUE 來實現
  • 主鍵和候選鍵同樣,只不過主鍵是惟一的,候選鍵能夠是多個,因此一樣具備惟一性,且不能爲 NULL

建立候選鍵後,數據庫也會自動建立 UNIQUE 索引對象

參照完整性(reference 或稱做引用)

  • 能夠在 CREATE TABLE 或 ALTER TABLE 語句中使用 FOREIGN KEY 和 REFERENCES 來實現索引

    FOREIGN KEY(column_name, ...)
    		REFERENCES table_name(column_name, ...)
    		[ON DELETE reference_option] 
    		[ON UPDATE reference_option] 
    #column_name 的語法格式爲:column_name [(length)] [ASC | DESC]
    #refrence_option 提供選項有:RESTRICT | CASCADE | SET NULL | NO ACTION
    #"[]"內的參數爲可選,不加也行,根據實際需求選擇就好
    複製代碼
  • 關鍵字ON DELETEON UPDATE是指定參照的動做,只要涉及這兩個動做,系統就會檢查完整性約束,即refrence_option,若是沒有明確指定,那麼其默認值爲RESTRICT事件

    • RESTRICT :拒絕操做,當刪除或更新被參照表時涉及到了被參照的字段,而且該字段在外鍵中存在數據,那麼系統將拒絕操做
    • CASCADE :級聯操做,當刪除或更新被參照表時,會同時刪除或更新參照表中的匹配的元組
    • SET NULL :置空操做,當刪除或更新被參照表時,會將參照表中對應的外鍵字段的值設爲NULL,前提是該字段在參照表中沒有聲明NOT NULL
    • NO ACTION :不作操做,和 RESTRICT 相同

    參照表:聲明瞭FOREIGN KEY的表 A。被參照表:主鍵被表 A 聲明爲FOREIGN KEYget

    舉個例子:學生有選歷史課,可是如今學校決定不開設歷史課了,要把歷史課從課程表刪除,可是刪除的時候會檢查有沒有被引用,若是存在引用則刪除失敗,這就是RESTRICT。若是刪除歷史課的同時,將全部學生選課表中的歷史課也刪除,這就是CASCADE。若是刪除了歷史課,只是將選課表中的歷史課設爲NULL,這就是SET NULL,萬一哪天又恢復歷史課呢🤣

用戶定義的完整性

  • 關鍵字

    • CHECK:在更新或刪除時,檢查數據是否知足條件
    • NOT NULL:比較經常使用 ,定義一個字段不可爲空。能夠理解爲 CHECK(column NOT NULL)
  • TRIGGER(觸發器)

    • 觸發器是由事件驅動的,主要用於保護主鍵和外鍵的參照完整性和數據一致性
    • 沒法主動調用,可理解爲數據庫系統維護了一個線程或一組線程去輪詢加了觸發器的事件

    可使用 CREATE TRIGGER 建立觸發器,其格式爲:

    CREATE TRIGGER trigger_name trigger_time trigger_event
    	ON table_name FOR EACH ROW trigger_body
     # trigger_name:觸發器惟一命名
     # trigger_body:觸發器具體的執行邏輯
     # trigger_event:事件類型,INSERT DELETE UPDATE
     # trigger_time:觸發時間,參照的是 trigger_event 事件發生時間,AFTER(經常使用) BEFORE
    
    複製代碼

綜上,咱們簡單的總結下

約束:向表中插入數據時,數據庫會判斷數據是否符合約束,不符合則插入失敗

  • CHECK :用於約束範圍 例如 CHECK(score>60)
  • DEFAULT :字段沒有值的話,給定一個默認值
  • UNIQUE :約束 row 的惟一性,能夠創建多個
  • PRIMARY KEY :約束 row 的惟一性,只能創建一個
  • NOT NULL :約束強制 column (字段或直列)不接受 NULL 值,且字段始終包含值
  • FOREIGN KEY :A 表與 B 表中同名的字段,且是 B 表的 PRIMARY KEY(或者說 A 表的 FOREIGN KEY 指向 B 表中的 PRIMARY KEY)

參考:

相關文章
相關標籤/搜索