SQL 約束
在本教程中,你將學習如何使用 SQL 約束。
什麼是約束?
約束只是對錶的一列或多列的限制,以限制可以儲存在該列中的值的型別。約束提供了一種標準機制來維護表中資料的準確性和完整性。
SQL 中有幾種不同型別的約束,包括:
NOT NULL
PRIMARY KEY
UNIQUE
DEFAULT
FOREIGN KEY
CHECK
現在,讓我們詳細討論這些約束中的每一個。
NOT NULL 約束
NOT NULL
限制規定列不接受 NULL
值。
這意味著如果 NOT NULL
對列應用約束,則無法在不為該列新增非 NULL
值的情況下在表中插入新行。
以下 SQL 語句建立一個名為 persons 的表,其中包含四列,其中三列,id,name 和 phone 不接受 NULL 值。
CREATE TABLE persons (
id INT NOT NULL,
name VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL
);
注意: 空值或 NULL
不等於零(0
),空白或零長度字串,如 ''
。 NULL
表示沒有輸入。
主鍵約束
PRIMARY KEY
約束識別具有唯一地標識一個表中的行的值列的列或組。表中沒有兩行可以具有相同的主鍵值。此外,你不能在主鍵列中輸入 NULL
值。
以下 SQL 語句建立名為 persons 的表,並將 id 列指定為主鍵。這意味著此欄位不允許 NULL
或重複值。
CREATE TABLE persons (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL
);
提示: 主鍵通常由表中的一列組成,但是多個列可以包含主鍵,例如,員工的電子郵件地址或分配的標識號是員工表的邏輯主鍵。
UNIQUE
約束
UNIQUE
約束限制一個或多個列在表中包含唯一值。
儘管 UNIQUE
約束和 PRIMARY KEY
約束都強制實施唯一性,但如果要強制實施不是主鍵的列或列組合的唯一性,請使用 UNIQUE
約束而不是 PRIMARY KEY
約束。
以下 SQL 語句建立名為 persons 的表,並將 phone 列指定為唯一。這意味著此欄位不允許重複值。
CREATE TABLE persons (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL UNIQUE
);
注意: UNIQUE
可以在表上定義多個約束,而在表上只能定義一個 PRIMARY KEY
約束。此外,與 PRIMARY KEY
約束不同, UNIQUE
約束允許 NULL
值。
DEFAULT 約束
DEFAULT
約束指定列的預設值。
列預設值是當 INSERT
語句未顯式指定特定值時,資料庫引擎將在列中插入的某個值。
以下 SQL 語句為 country 列建立預設值。
CREATE TABLE persons (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL UNIQUE,
country VARCHAR(30) NOT NULL DEFAULT 'Australia'
);
注意: 如果將表列定義為 NOT NULL
,但為列指定了預設值,則在 INSERT
語句中不需要為該列顯式指定值,以便在表中插入新行。
外來鍵約束
外來鍵(FK)是列或列的組合,用於建立和強制兩個表中的資料之間的關係。
這是一個示例圖,顯示了 employees 和 departments 表之間的關係。如果仔細檢視,你會注意到 employees 表的 dept_id 列與 departments 表的主鍵列匹配。因此,employees 表的 dept_id 列是 departments 表的外來鍵。
在 MySQL 中,你可以通過 FOREIGN KEY
在建立表時定義約束來建立外來鍵,如下所示。以下語句在 employees 表的 dept_id 列上建立一個外來鍵,該列引用 departments 表的 dept_id 列。
CREATE TABLE employees (
emp_id INT NOT NULL PRIMARY KEY,
emp_name VARCHAR(55) NOT NULL,
hire_date DATE NOT NULL,
salary INT,
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
CHECK
約束
CHECK
約束是用來限制可被放置在一個列中的值。
例如,可以通過建立 CHECK
允許值僅為 3,000 到 10,000 的約束來限制工資列的值範圍。這可以防止工資超出正常工資範圍。這是一個例子:
CREATE TABLE employees (
emp_id INT NOT NULL PRIMARY KEY,
emp_name VARCHAR(55) NOT NULL,
hire_date DATE NOT NULL,
salary INT NOT NULL CHECK (salary >= 3000 AND salary <= 10000),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
注意: MySQL 不支援 SQL 檢查約束。然而 CHECK
子句被解析但被 MySQL 的所有儲存引擎忽略。