摘要:在本教程中,您将学习如何为列定义NOT NULL
约束、向现有列添加NOT NULL
约束以及从列中删除NOT NULL
约束。
MySQL NOT NULL
约束简介
NOT NULL
约束是一种列约束,可确保存储在列中的值不为NULL
。
定义NOT NULL
约束的语法如下:
column_name data_type NOT NULL;
Code language: SQL (Structured Query Language) (sql)
一列只能包含一个NOT NULL
约束,该约束指定该列不得包含任何NULL
值的规则。换句话说,如果您更新或插入NULL
到NOT NULL
列,MySQL 将发出错误。
以下CREATE TABLE
语句创建tasks
表:
CREATE TABLE tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
start_date DATE NOT NULL,
end_date DATE
);
Code language: SQL (Structured Query Language) (sql)
在tasks
表中,我们使用NOT NULL
约束显式定义title
和start_date
列。 id
列具有PRIMARY KEY
约束,因此,它隐式包含NOT NULL
约束。
end_date
列可以有NULL
值,假设当您创建新任务时,您可能不知道该任务何时可以完成。
在表的每一列中都使用NOT NULL
约束是一个很好的做法,除非您有充分的理由不这样做。
通常, NULL
值会使您的查询更加复杂,因为您必须使用ISNULL()
、 IFNULL()
和NULLIF()
等函数来处理NULL
。
向现有列添加NOT NULL
约束
通常,您在创建表时向列添加NOT NULL
约束。有时,您想要向现有表的可 NULL 列添加NOT NULL
约束。在这种情况下,您可以使用以下步骤:
- 检查列的当前值是否有
NULL
。 - 如果
NULLs
存在,则将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);
Code language: SQL (Structured Query Language) (sql)
假设您想要强制用户在创建新任务时给出预计结束日期。要实现此规则,请向tasks
表的end_date
列添加NOT NULL
约束。
首先,使用IS NULL
运算符查找end_date
列中包含NULLs
的行:
SELECT *
FROM tasks
WHERE end_date IS NULL;
Code language: SQL (Structured Query Language) (sql)

该查询返回一行end_date
中包含NULL
的行。
其次,将NULL
值更新为非空值。在这种情况下,您可以制定一个规则,如果end_date
为NULL
,则结束日期为开始日期后一周。
UPDATE tasks
SET
end_date = start_date + 7
WHERE
end_date IS NULL;
Code language: SQL (Structured Query Language) (sql)
此查询验证更新:
SELECT * FROM tasks;
Code language: SQL (Structured Query Language) (sql)

第三,使用以下ALTER TABLE
语句向end_date
列添加NOT NULL
约束:
ALTER TABLE table_name
CHANGE
old_column_name
new_column_name column_definition;
Code language: SQL (Structured Query Language) (sql)
在这种情况下,新旧列名的名称相同,只是该列必须具有NOT NULL
约束:
ALTER TABLE tasks
CHANGE
end_date
end_date DATE NOT NULL;
Code language: SQL (Structured Query Language) (sql)
让我们使用DESCRIBE
语句验证更改:
DESCRIBE tasks;
Code language: SQL (Structured Query Language) (sql)

如您所见, NOT NULL
约束已成功添加到end_date
列。
删除NOT NULL
约束
要删除列的NOT NULL
约束,请使用ALTER TABLE..MODIFY
语句:
ALTER TABLE table_name
MODIFY column_name column_definition;
Code language: SQL (Structured Query Language) (sql)
请注意,列定义 (column_definition) 必须重述原始列定义,且不带NOT NULL
约束。
例如,以下语句从tasks
表的end_date
列中删除NOT NULL
约束:
ALTER TABLE tasks
MODIFY
end_date
end_date DATE NOT NULL;
Code language: SQL (Structured Query Language) (sql)
为了确保该语句确实删除了NOT NULL
约束,可以使用SHOW CREATE TABLE
命令查看完整的列定义:

DESCRIBE
语句也可以实现这一目的:描述任务;

在本教程中,您学习了如何为列定义NOT NULL
约束、向列添加NOT NULL
约束以及从列中删除NOT NULL
约束。