SQL 約束

在本教程中,你將學習如何使用 SQL 約束。

什麼是約束?

約束只是對錶的一列或多列的限制,以限制可以儲存在該列中的值的型別。約束提供了一種標準機制來維護表中資料的準確性和完整性。

SQL 中有幾種不同型別的約束,包括:

  • NOT NULL
  • PRIMARY KEY
  • UNIQUE
  • DEFAULT
  • FOREIGN KEY
  • CHECK

現在,讓我們詳細討論這些約束中的每一個。

NOT NULL 約束

NOT NULL 限制規定列不接受 NULL 值。

這意味著如果 NOT NULL 對列應用約束,則無法在不為該列新增非 NULL 值的情況下在表中插入新行。

以下 SQL 語句建立一個名為 persons 的表,其中包含四列,其中三列,idnamephone 不接受 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)是列或列的組合,用於建立和強制兩個表中的資料之間的關係。

這是一個示例圖,顯示了 employeesdepartments 表之間的關係。如果仔細檢視,你會注意到 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 的所有儲存引擎忽略。