MySQL NOT NULL約束

2019-10-16 22:58:44

本教學將向您介紹MySQL NOT NULL約束,幫助我們來保持資料的一致性。

MySQL NOT NULL約束簡介

NOT NULL約束是一個列約束,僅將列的值強制為非NULL值。

NOT NULL約束的語法如下:

column_name data_type NOT NULL;

列可能只包含一個NOT NULL約束,它指定列不能包含任何NULL值。

以下CREATE TABLE語句建立tasts表:

USE testdb;
CREATE TABLE tasks (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE
);

titlestart_date列明確地顯示NOT NULL約束。 id列具有PRIMARY KEY約束,因此它隱含地包含一個NOT NULL約束。

end_date列可以具有NULL值。這是因為當新增新任務記錄時,我們可能還不知道任務的結束日期。

在表的每一列中都有NOT NULL約束是最好的做法,除非你有很好的理由不使用NOT NULL約束。

通常,NULL值使查詢更加複雜。在這種情況下,可以使用NOT NULL約束並為列提供預設值。請參閱以下範例:

use testdb;
CREATE TABLE inventory (
    material_no VARCHAR(18),
    warehouse_no VARCHAR(10),
    quantity DECIMAL(19 , 2 ) NOT NULL DEFAULT 0,
    base_unit VARCHAR(10) NOT NULL,
    PRIMARY KEY (material_no , warehouse_no)
);

在此範例中,數量(quantity)列的預設值為0,因為當向inventory表新增一行資料時,數量(quantity)列的值應該為0,而不是NULL

向現有列新增NOT NULL約束

通常,在建立表時向列新增NOT NULL約束。 但是,有時希望將NOT NULL約束新增到現有表的NULL列。 在這種情況下,可以使用以下步驟:

  • 檢查列的當前值。
  • 將所有NULL值更新為非NULL值。
  • 新增NOT NULL約束

下面來看一個例子。

我們將資料插入到tasks表中以更好地演示。

INSERT INTO tasks(title ,start_date, end_date)
VALUES('Learn MySQL NOT NULL constraint', '2017-02-01','2017-02-02'),
      ('Check and update NOT NULL constraint to your database', '2017-02-01',NULL);

現在,假設要強制使用者在建立新任務時給出估計的結束日期。為此,您需要將NOT NULL約束新增到tasts表的end_date列上。

首先檢查end_date列的值,使用IS NULL運算子來檢查列中的值是否有NULL值:

SELECT 
    *
FROM
    tasks
WHERE
    end_date IS NULL;

執行上面的查詢語句,得到以下結果 -

+----+-------------------------------------------------------+------------+----------+
| id | title                                                 | start_date | end_date |
+----+-------------------------------------------------------+------------+----------+
|  2 | Check and update NOT NULL constraint to your database | 2017-02-01 | NULL     |
+----+-------------------------------------------------------+------------+----------+
1 row in set

查詢返回end_date值為NULL的一行記錄。

其次,將NULL更新為非NULL值。在這種情況下,我們可以建立一個規則,如果end_dateNULL,則在開始日期後一週結束日期。

UPDATE tasks 
SET 
    end_date = start_date + 7
WHERE
    end_date IS NULL;

我們來檢視一下這個修改後的變化:

SELECT 
    *
FROM
    tasks;

執行上面的查詢語句,得到以下結果 -

+----+-------------------------------------------------------+------------+------------+
| id | title                                                 | start_date | end_date   |
+----+-------------------------------------------------------+------------+------------+
|  1 | Learn MySQL NOT NULL constraint                       | 2017-02-01 | 2017-02-02 |
|  2 | Check and update NOT NULL constraint to your database | 2017-02-01 | 2017-02-08 |
+----+-------------------------------------------------------+------------+------------+
2 rows in set

第三,將NOT NULL約束新增到end_date列。要執行此操作,請使用以下ALTER TABLE語句:

ALTER TABLE table_name
CHANGE old_column_name new_column_name new_column_definition;

在上面例子中,除了具有NOT NULL約束的列定義之外,舊的列名稱和新的列名稱必須相同:

ALTER TABLE tasks 
CHANGE end_date end_date DATE NOT NULL;

使用DESCRIBEDESC語句來驗證更改:

mysql> DESC tasks;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255) | NO   |     | NULL    |                |
| start_date | date         | NO   |     | NULL    |                |
| end_date   | date         | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
4 rows in set

如上所示,NOT NULL約束被新增到end_date列。

在本教學中,您已經學習了如何為列定義NOT NULL約束,並將NOT NULL約束新增到現有列。