資料完整性對於任何資料庫系統來說都是很重要的,它能確保儲存的資料是準確、一致和有意義的。在 PostgreSQL 中,維護資料完整性的一個強大工具是使用檢查(Check)條件約束。這些條件約束可讓你定義資料必須遵守的規則,防止插入或修改無效資料。在本文中,我們將使用免費的 DVD 租賃資料庫 作為參考,探索如何使用檢查條件約束來驗證 PostgreSQL 中的資料。
認識檢查條件約束
檢查條件約束是一個規則能限制可以輸入到資料表中一欄或一組欄中的值。這些規則由資料庫系統強制執行,防止插入或修改違反指定條件的列。檢查條件約束是使用 CHECK
關鍵字定義,後面跟著一個計算結果為 Boolean 值的運算式。
驗證租借期
規則我們在「dvdrental」資料庫中有一個「rental」資料表的修改版本,其中包含「rental_duration」欄。在 Navicat 資料表設計器中,這個資料表的定義如下所示:
現在,假設我們希望確保租借期必須大於 0 日。我們可以透過在「rentals_with_rental_period」資料表中新增檢查條件約束來實現這一點,具體做法如下:
ALTER TABLE rentals_with_rental_period
ADD CONSTRAINT rental_duration_check
CHECK (rental_duration > 0);
在 Navicat 中,我們可以在資料表設計器的「檢查」索引標籤中新增檢查條件約束。我們只需要提供一個運算式和名稱。如果不提供名稱,Navicat 將會自動建立一個唯一的名稱!
在點擊「儲存」按鈕後,Navicat 將建立檢查條件約束,或者如果任何列違反了約束,則顯示錯誤訊息。
有了此條件約束,任何試圖在「rentals_with_rental_period」資料表中插入或更新租借期小於或等於 0 的列的作業都會引發錯誤,確保只允許有效的租借期。
確保評級有效
另一個範例是驗證「dvdrental」資料庫中「film」資料表的電影評級。假設我們要將評級限制為僅接受某些特定的值,例如「G」、「PG」、「PG-13」、「R」或「NC-17」。我們可以使用檢查條件約束來實現這一點:
ALTER TABLE film
ADD CONSTRAINT film_rating_check
CHECK (rating IN ('G', 'PG', 'PG-13', 'R', 'NC-17'));
相同的條件約束在 Navicat 資料表設計器中顯示如下:
現在,任何試圖在「film」資料表中插入或更新評級不是指定值之一的列的作業都將被拒絕,以確保只允許有效的評級。
處理 NULL 值
需要注意的是,除非檢查條件約束明確包含檢查 NULL
的條件,否則約束不會檢查一欄或多欄包含 NULL
值的列。例如,要強制「film」資料表中的「rental_rate」欄位的值必須大於 0 且不為 NULL
,我們可以使用以下的約束:
ALTER TABLE film
ADD CONSTRAINT film_rental_rate_check
CHECK (rental_rate > 0 AND rental_rate IS NOT NULL);
相同的條件約束在 Navicat 資料表設計器中顯示如下:
總結
檢查條件約束是確保 PostgreSQL 中資料完整性的強大工具。透過定義資料必須遵守的規則,你可以防止插入或修改無效的資料,有助維持資料庫的準確性和一致性。透過將它們納入資料庫設計中,你可以構建堅固可靠的資料系統,滿足組織的需求。