SQL約束

2023-03-11 18:01:30

1、約束

1.1 約束
在 SQL 中,約束是規定表中的資料規則。若存在違反約束的行為,行為就會被阻止。它能幫助管理員更好地管理資料庫,並且確保資料庫中資料的正確性和有效性。例如在後臺的資料庫設計中對要輸入的資料進行核查或判斷,再決定是否寫入資料庫,這都是約束的應用。

1.1、非空約束NOT NULL

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 而不是空串指定。

1.2唯一約束UNIQUE

在前面的學習中我們知道了 NOT NULL 約束是強制列不接受 NULL 值。
在有些情況下,我們不希望一個表中出現重複的記錄,這時候我們需要用到 UNIQUE 約束來解決這些問題。

  • UNIQUE約束唯一標識資料庫表中的每條記錄
  • UNIQUE 和 主鍵約束均為列或列集合提供了唯一性的保證
  • 主鍵約束會自動定義一個UNIQUE約束,或者說主鍵約束是一種特殊的UNIQUE約束。但是二者有明顯的區別:每個表可以有多個UNIQUE約束,但是隻能有一個主鍵約束。

1.2.1CREATE TABLE 時的 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`)
)

1.2.2 ALTER TABLE 時的 UNIQUE 約束

當表已被建立時,在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`)

1.2.3復原UNIQUE約束

如需復原 UNIQUE 約束 :

MySQL

ALTER TABLE `Persons`
DROP INDEX uc_PersonID

SQL Server / Oracle / MS Access

ALTER TABLE `Persons`
DROP CONSTRAINT uc_PersonID

1.3主鍵約束PRIMARY KEY

PRIMARY KEY 約束唯一標識資料庫表中的每條記錄 ,簡單的說,PRIMARY KEY = UNIQUE + NOT NULL ,從技術的角度來看,PRIMARY KEY 和 UNIQUE 有很多相似之處。但還是有以下區別:

NOT NULL UNIQUE 可以將表的一列或多列定義為唯一性屬性,而 PRIMARY KEY 設為多列時,僅能保證多列之和是唯一的,具體到某一列可能會重複。
PRIMARY KEY 可以與外來鍵配合,從而形成主從表的關係,而 NOT NULL UNIQUE 則做不到這一點

如:
表一:使用者id(主鍵),使用者名稱
表二:銀行卡號id(主鍵),使用者id(外來鍵)
則表一為主表,表二為從表

  • 更大的區別在邏輯設計上。
    PRIMARY KEY 一般在邏輯設計中用作記錄標識,這也是設定 PRIMARY KEY 的本來用意,而 UNIQUE 只是為了保證域/域組的唯一性。

1.3.1CREATE TABLE時新增PRIMARY KEY 約束