SQL NOT NULL 約束

摘要:本教學將示範如何使用 SQL NOT NULL 約束來強制欄位不儲存 NULL 值。

SQL NOT NULL 約束簡介

NOT NULL 約束是一種欄位約束,它定義了規則,限制欄位只能包含非 NULL 值。

這表示當我們使用 INSERT 語法將新列插入表格時,我們必須為 NOT NULL 欄位指定值。

以下語法說明了 NOT NULL 約束的語法。它強制 column_name 接受任何 NULL 值。

CREATE TABLE table_name(
   ...
   column_name data_type NOT NULL,
   ...
);Code language: SQL (Structured Query Language) (sql)

從邏輯上講,NOT NULL 約束等同於 CHECK 約束,因此,上述語法等同於以下語法。

CREATE TABLE table_name ( 
   ...
   column_name data_type,
   ...
   CHECK (column_name IS NOT NULL)
);Code language: SQL (Structured Query Language) (sql)

例如,以下語法建立了一個 training 表格,其中 taken_date 欄位具有 NOT NULL 約束。

CREATE TABLE training (
    employee_id INT,
    course_id INT,
    taken_date DATE NOT NULL,
    PRIMARY KEY (employee_id , course_id)
);Code language: SQL (Structured Query Language) (sql)

大多數關聯式資料庫管理系統預設會自動將 NOT NULL 約束加到主鍵欄位,因此,我們不必明確地指定它。

以下 INSERT 語法違反了 NOT NULL 約束。

INSERT INTO training(employee_id,course_id)
VALUES(1,1);Code language: SQL (Structured Query Language) (sql)

ALTER TABLE NOT NULL 語法

通常,我們在建立表格時為欄位定義 NOT NULL 約束。然而,有時我們想將接受 NULL 值的欄位約束更改為不接受 NULL 值。

要進行變更,我們需要執行以下兩個步驟

首先,使用 UPDATE 語法將所有目前的 NULL 值更新為非 NULL 值。

UPDATE table_name
SET column_name = 0
WHERE
	column_name IS NULL;Code language: SQL (Structured Query Language) (sql)

請注意,我們在 WHERE 子句中使用 IS NULL 運算子來找出 column_name 為 NULL 的列。

其次,使用 ALTER TABLE 語法將 NOT NULL 約束新增至欄位。

ALTER TABLE table_name
MODIFY column_name data_type NOT NULL;Code language: SQL (Structured Query Language) (sql)

假設 training 表格的 taken_date 欄位為 NULL,而我們想要將其變更為 NOT NULL。

首先,我們將 taken_date 欄位中的所有 NULL 值更新為特定的日期,例如,目前的日期。

UPDATE training
SET taken_date = CURRENT_DATE ()
WHERE
	taken_date IS NULL;Code language: SQL (Structured Query Language) (sql)

其次,我們將 take_date 欄位變更為 NOT NULL 約束。

ALTER TABLE training 
MODIFY taken_date date NOT NULL;Code language: SQL (Structured Query Language) (sql)

在本教學中,我們已示範如何使用 NOT NULL 約束來約束欄位僅接受非 NULL 值。

本教學對您有幫助嗎?