數據庫的完整性約束

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

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

實體完整性

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

  • 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

  • 主鍵約束

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

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

創建主鍵後,數據庫會自動創建唯一索引,用於對主鍵的快速查詢,索引名默認爲PRIMARY,也可以重新自定義命名

  • 創建候選鍵索引
  • 可以在 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 KEY
    舉個例子:學生有選歷史課,但是現在學校決定不開設歷史課了,要把歷史課從課程表刪除,但是刪除的時候會檢查有沒有被引用,如果存在引用則刪除失敗,這就是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)

參考:

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