iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 16
1
AI & Data

後端前進PostgreSQL系列 第 16

資料表設計-約束條件

  • 分享至 

  • xImage
  •  

昨天介紹一些資料表設計的命名規則,今天介紹約束條件,約束可以確保資料的正確性,但加入約束以後再匯入資料表時要特別注意資料是否正確,並留意匯入順序,才不會發生無法匯入的情況。

約束條件

單一張資料表的約束條件,關鍵字有以下三種。

CHECK 檢查資料值是否符合邏輯判斷式
UNIQUE 檢查資料表中該欄位的欄位值是否為獨一無二的值。
NOT NULL 欄位資料值不能為空值NULL

這幾種都可以去檢查預計寫入或更新的資料是否有符合規定。

先從簡單的開始吧!

NOT NULL

假設資料設定為每隻動物都要有自己的名字,name欄位不允許未填入名稱,可以在創建資料表時宣告欄位NOT NULL

CREATE TABLE animals (
    id bigserial,
    name varchar(255) NOT NULL,
    created_at timestamp,
    updated_at timestamp
);

刪除資料表可以使用 DROP TABLE animals 如果之前有一起跟著文章做 ,新建過 animals資料表,再新增一次PostgreSQL會返回錯誤,如果裡面沒有重要資料可以刪除它。做任何變更前,請三思而後行!

UNIQUE

假設有一張會員資料表,每個EMAIL只能註冊一次!我們就可以使用UNIQUE關鍵字去限制email欄位只能在資料表中出現一次

CREATE TABLE users (
    id bigserial,
    name varchar(255) NOT NULL,
    email varchar(255),
    created_at timestamp,
    updated_at timestamp,
    CONSTRAINT email_unique UNIQUE (email)
);

設定方法如最後一行的宣告! 關鍵字 CONSTRAINT 後設定一個名稱 email_unique (可自行命名,但通常就是欄位加上_unique) 再接上 UNIQUE 並附上對應欄位 email

這麼一來資料表中該欄位(email)的值,只會出現一次,不會有相同的資料出現在其他筆資料的email欄位中。

CHECK

這個我比較少用,之前有聽過存入資料庫時的檢查,但沒有在實際的專案上用過,只能簡單介紹一下。

約束條件CHECK關鍵字,可以在新建使用者時檢查使用者的permission欄位是管理員(admin)還是一般會員(member)

CREATE TABLE users (
    id bigserial,
    name varchar(255) NOT NULL,
    email varchar(255),
    permission varchar(50),
    created_at timestamp,
    updated_at timestamp,
    CONSTRAINT email_unique UNIQUE (email),
    CONSTRAINT check_permission_in_list CHECK (permission IN ('admin', 'member'))
);

如最後一行SQL語法所示,設定一個檢查名稱 check_permission_in_list 接上 CHECK 關鍵字,後方用小括弧包著,撰寫邏輯判斷 permission IN ('admin', 'member') 表示寫入資料時檢查 permission 欄位的資料是否符合,字串admin或是 member,如果不符合任一個字串會出現錯誤。

CHECK 關鍵字後的檢查條件可以是任意邏輯運算,依照自己的需求去撰寫。

例如 薪資欄位值不能小於0,看似一件小事情,但之前在PostgreSQL的聚會時聽到大大討論到這個話題,這種小事在大公司也是一件大事,所以必須要檢查。

預告明天,今天介紹的都是對於輸入的欄位值檢查,明天會介紹有關於主鍵以及外鍵的約束。

一對一、一對多、多對多的設計模式,如果不記得可以參考我第11天的文章 整理資料表(一) 什麼是關聯式資料表? 複習一下~明天見~


上一篇
資料表設計規則-命名規則
下一篇
資料表設計-約束條件-外鍵
系列文
後端前進PostgreSQL30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言