昨天介紹一些資料表設計的命名規則,今天介紹約束條件,約束可以確保資料的正確性,但加入約束以後再匯入資料表時要特別注意資料是否正確,並留意匯入順序,才不會發生無法匯入的情況。
單一張資料表的約束條件,關鍵字有以下三種。
CHECK
檢查資料值是否符合邏輯判斷式UNIQUE
檢查資料表中該欄位的欄位值是否為獨一無二的值。NOT NULL
欄位資料值不能為空值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會返回錯誤,如果裡面沒有重要資料可以刪除它。做任何變更前,請三思而後行!
假設有一張會員資料表,每個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
關鍵字,可以在新建使用者時檢查使用者的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天的文章 整理資料表(一) 什麼是關聯式資料表? 複習一下~明天見~