1.1 約束
在 SQL 中,約束是規定表中的資料規則。若存在違反約束的行為,行為就會被阻止。它能幫助管理員更好地管理資料庫,並且確保資料庫中資料的正確性和有效性。例如在後臺的資料庫設計中對要輸入的資料進行核查或判斷,再決定是否寫入資料庫,這都是約束的應用。
NOT NULL 約束強制列不接受 NULL 值,強制欄位始終包含值,這意味著,如果不向欄位新增值,就無法插入新紀錄或者更新記錄。
下面的 SQL 強制 ID 列、 LastName 列以及 FirstName 列不接受 NULL 值:
CREATE TABLE `Persons` (
`ID` int NOT NULL,
`LastName` varchar(255) NOT NULL,
`FirstName` varchar(255) NOT NULL,
`Age` int
);
在一個已建立的表的 Age 欄位中新增 NOT NULL 約束如下所示:
ALTER TABLE `Persons`
MODIFY `Age` int NOT NULL;
在一個已建立的表的 Age 欄位中刪除 NOT NULL 約束如下所示:
ALTER TABLE `Persons`
MODIFY `Age` int NULL;
注意
不要把 NULL 值與空串相混淆。NULL 值是沒有值,
它不是空串。如果指定' '(兩個單引號,其間沒有字元),這
在 NOT NULL 列中是允許的。空串是一個有效的值,它不是無
值。NULL 值用關鍵字 NULL 而不是空串指定。
在前面的學習中我們知道了 NOT NULL 約束是強制列不接受 NULL 值。
在有些情況下,我們不希望一個表中出現重複的記錄,這時候我們需要用到 UNIQUE 約束來解決這些問題。
MySQL
CREATE TABLE `Persons`
(
`P_Id` int NOT NULL,
`LastName` varchar(255) NOT NULL,
`FirstName` varchar(255),
`Address` varchar(255),
`City` varchar(255),
UNIQUE (`P_Id`)
)
SQL Server | Oracle | MS Access
CREATE TABLE `Persons`
(
`P_Id` int NOT NULL UNIQUE,
`LastName` varchar(255) NOT NULL,
`FirstName` varchar(255),
`Address` varchar(255),
`City` varchar(255)
)
命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束:
MySQL / SQL Server / Oracle / MS Access
CREATE TABLE `Persons`
(
`P_Id` int NOT NULL,
`LastName` varchar(255) NOT NULL,
`FirstName` varchar(255),
`Address` varchar(255),
`City` varchar(255),
CONSTRAINT uc_PersonID UNIQUE (`P_Id`,`LastName`)
)
當表已被建立時,在P_id列建立UNIQUE約束:
MySQL / SQL Server / Oracle / MS Access
ALTER TABLE `Persons`
ADD UNIQUE (`P_Id`)
當表已被建立時,需命名UNIQUE約束,並定義多個列的UNIQUE約束:
MySQL / SQL Server / Oracle / MS Access
ALTER TABLE `Persons`
ADD CONSTRAINT uc_PersonID UNIQUE (`P_Id`,`LastName`)
如需復原 UNIQUE 約束 :
MySQL
ALTER TABLE `Persons`
DROP INDEX uc_PersonID
SQL Server / Oracle / MS Access
ALTER TABLE `Persons`
DROP CONSTRAINT uc_PersonID
PRIMARY KEY 約束唯一標識資料庫表中的每條記錄 ,簡單的說,PRIMARY KEY = UNIQUE + NOT NULL ,從技術的角度來看,PRIMARY KEY 和 UNIQUE 有很多相似之處。但還是有以下區別:
NOT NULL UNIQUE 可以將表的一列或多列定義為唯一性屬性,而 PRIMARY KEY 設為多列時,僅能保證多列之和是唯一的,具體到某一列可能會重複。
PRIMARY KEY 可以與外來鍵配合,從而形成主從表的關係,而 NOT NULL UNIQUE 則做不到這一點
如:
表一:使用者id(主鍵),使用者名稱
表二:銀行卡號id(主鍵),使用者id(外來鍵)
則表一為主表,表二為從表