SQL Not Null約束


本教學將演示如何使用SQL NOT NULL約束來強制列儲存NULL值。

1. SQL NOT NULL約束簡介

NOT NULL約束是一個列約束,它定義將列限制為僅具有非NULL值的規則。

這意味著當使用INSERT語句向表中插入新行時,必須指定NOT NULL列的值。以下語句是NOT NULL約束語法。 它強制column_name不能接受NULL值。

CREATE TABLE table_name(
   ...
   column_name data_type NOT NULL,
   ...
);

邏輯上,NOT NULL約束等同於CHECK約束,因此,上述語句等效於以下語句。

CREATE TABLE table_name ( 
   ...
   column_name data_type,
   ...
   CHECK (column_name IS NOT NULL)
);

例如,以下語句建立一個名稱為training表,表中有帶一個NOT NULL約束的taken_date列。

CREATE TABLE training (
    employee_id INT,
    course_id INT,
    taken_date DATE NOT NULL,
    PRIMARY KEY (employee_id , course_id)
);

大多數關聯式資料庫管理系統預設情況下會自動將NOT NULL約束新增到主鍵列,因此不必明確指定它。

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

INSERT INTO training(employee_id,course_id)
VALUES(1,1);

上面插入語句中,taken_date列未指定值,因此預設使用NULL值,但是taken_date列指定了NOT NULL約束,所以插入資料時會出現錯誤。

2. ALTER TABLE NOT NULL語句

通常,在建立表時為列定義NOT NULL約束。 但是,有時希望更改列的約束以接受NULL值。

要進行更改以接受NULL值,可參考以下兩個步驟:

首先,使用UPDATE語句將所有當前NULL值更新為非NULL值。

UPDATE table_name
SET column_name = 0
WHERE
    column_name IS NULL;

請注意,在WHERE子句中使用IS NULL運算子來查詢column_nameNULL的行。

其次,使用ALTER TABLE語句將NOT NULL約束新增到列

ALTER TABLE table_name
MODIFY column_name data_type NOT NULL;

假設training表的taken_date列為NULL,想將它更改為NOT NULL

首先,將taken_date列中的所有NULL值更新為特定日期,例如:當前日期。

UPDATE training
SET taken_date = CURRENT_DATE ()
WHERE
    taken_date IS NULL;

其次,將take_date列更改為NOT NULL約束。

ALTER TABLE training 
MODIFY taken_date date NOT NULL;

在本教學中,講解了NOT NULL約束的概念,並演示了如何使用NOT NULL約束將列約束為僅接受非NULL值。