本教學將向您介紹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
);
title
和start_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
約束新增到現有表的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_date
為NULL
,則在開始日期後一週結束日期。
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;
使用DESCRIBE或DESC
語句來驗證更改:
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
約束新增到現有列。