什麼是數據庫約束?
數據庫約束是為了保證數據的完整性而實現的一套機制,它具體的根據各個不同的數據庫的實現而有不同的工具。
一般來說有以下幾種實現方式:
1、檢查約束:
通過在定義數據庫表裡,在字段級或者是在表級加入的檢查約束,使其滿足特定的要求。
比如以下的表定義:
CRATE TABLE student(
id serial,
name varchar(10),
scrore integer CHECK (scrore > 0));
定義分數不能小於0。
也可以在表級定義:
CHECK (字段1 秘字段2之間的關系)
2、非空約束:
這個大家應該很熟悉了。直接在字段後面加上:NOT NULL。
3、唯一約束:
定義一個唯一約束但是它並不包括NULL值。直接在字段定義後加入UNIQUE即可定義一個唯一約束。
4、主鍵約束:
SQL 92建議在建立一個表時定義一個主鍵:它其實就是:唯一約束+非空約束。
5、外鍵:
所有約束裡數這個約束最有意思了:比如說有這樣一件事,你需要做一個學生查詢的網頁。那麼為了方便,你將建立三個數據表:
一個是學生情況表:
CREATE TABLE student(
id serial primary ke,
name varchar(10),
.......
);
一個表是記錄所開的課程
CREATE TABLE class(
class_id varchar(5) primary key,
describe varchar(20)
.....
);
一個表是記錄學生成績的表:
CREATE TABLE score(
id integer references student,
class_id varchar(5) references class,
score integer CHECK (score > 0)
);
這個時候你會發現以下幾件事:
如果你在成績表裡輸入不存在的學生和課程,數據系統將拒絕。如果你要刪除一個學生,但是他已經在成績表裡有記錄,數據庫將拒絕刪除這個學生的記錄。
那麼我們現在來看,前面一個對我們是有利的,因為誰都不想一個學生無緣無故的有了一個成績的記錄,但是在刪除的時候就會比較麻煩了,有時候我的確是想刪除這個學生。那麼我總不能在應用程序裡照顧得那麼周到吧。不要緊我們在定義數據表的時候只在外鍵那一樣加入以下控制就OK了,我們來重新定義數據表 score
CREATE TABLE score(
id integer references student ON UPDATE CASCADE ON DELETE CASCADE, //我們希望在學生記錄改變時自動改變分數記錄,在刪除學生級聯刪除分數記錄
class_id varchar(5) references class ON UPDATE CASCADE ON DELETE
RESTRICT, //我們希望在改變課程時自動改變分數記錄表裡關於課程的引用,但是不希望刪除課程時級聯刪除分數。
.....
);
這樣我們就可以很好做到數據完整了。