數據完整性對于任何數據庫系統來說都是很重要的一方面,它確保存儲的數據保持準確、一致且有意義的。在 PostgreSQL 中,維護數據完整性的一個強大工具是使用檢查約束。這些約束允許你定義數據必須遵守的規則,以防止無效數據的插入或修改。


了解檢查約束

檢查約束是限制可以輸入到表中的一個列或一組列中的值的規則。這些規則由數據庫系統強制執行,防止插入或修改違反指定條件的行。檢查約束是使用 CHECK 關鍵字定義的,后面跟著一個計算結果為布爾值的表達式。


驗證租賃期限

假設有一個場景,這個場景使用“dvdrental”數據庫中“rental”表的修改版,該表包含一個“rental_duration”列。在 Navicat 表設計器中,這個表的定義可能如下所示:



現在,假設我們希望確保每次租賃的時長始終大于零天。我們可以通過在“rentals_with_rental_period”表中添加檢查約束來實現這一目標,具體做法如下:


 

 

Navicat中,我們可以在表設計器的"Checks"選項卡中添加check約束。我們只需要提供一個表達式和可選名稱。Navicat會為我們創造一個唯一的名稱



Navicat 中,我們可以在表設計器的“檢查”選項卡中添加檢查約束。我們只需要提供一個表達式和可選的名稱。如果我們不提供名稱,Navicat 會為我們創建一個唯一的名稱!


通過執行此約束,任何嘗試在“rentals_with_rental_period”表中插入或更新一行,且租賃時長小于或等于零的操作都將導致錯誤,從而確保只允許有效的租賃時長。


確保有效評級


“dvdrental”數據庫中“film”表的另一個例子涉及驗證電影評級。假設我們想要將評級限制為某些特定值,如“G”、“PG”、“PG-13”、“R”或“NC-17”。我們可以通過檢查約束來實現這一點:


 

 

Navicat 表設計器中,這是相同的約束:



現在,任何嘗試在“film”表中插入或更新評級,但其值不是指定值之一的行的操作都將被拒絕,從而確保只允許有效的評級。


處理空值(NULL)


需要注意的是,除非約束中特別包含檢查 NULL 的條件,否則檢查約束不會應用于包含 NULL 值的一行或多行。例如,為了強制“film”表中的“rental_rate”列始終大于零且不為 NULL ,我們將使用以下約束:


   


Navicat 表設計器中,相同的約束如下: