MySQL NOT NULL约束
简介:在本教程中,您将学习如何为列定义NOT NULL约束,如何向现有列添加NOT NULL约束,以及如何从列中删除NOT NULL约束。
MySQL NOT NULL约束简介
NOT NULL约束是确保列中存储的值不为NULL的列约束。
定义NOT NULL约束的语法如下:
column_name data_type NOT NULL;
一列只能包含一个NOT NULL约束,该约束指定一个规则,该约束不得包含任何NULL值。
换句话说,如果您将NULL更新或插入到NOT NULL列中,MySQL将发出错误。
以下CREATE TABLE语句创建任务表:
CREATE TABLE tasks ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, start_date DATE NOT NULL, end_date DATE );
在任务表中,我们用NOT NULL约束显式定义title和start_date列。
id列具有PRIMARY KEY约束,因此,它隐式包括NOT NULL约束。
end_date列可以具有NULL值,假设您在创建新任务时可能不知道何时可以完成任务。
除非您有充分的理由不这样做,否则最好在表的每一列中使用NOT NULL约束。
通常,NULL值使查询更加复杂,因为必须使用ISNULL(),IFNULL()和NULLIF()之类的函数来处理NULL。
向现有列添加NOT NULL约束
通常,在创建表时,将NOT NULL约束添加到列。
有时,您想向现有表的可空列添加NOT NULL约束。
在这种情况下,请使用以下步骤:
检查该列的当前值是否为NULL。
如果存在NULL,则将NULL更新为非NULL。
用NOT NULL约束修改列。
考虑以下示例。
以下语句将一些行插入到演示的任务表中。
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);
假设您要在创建新任务时强制用户提供估计的结束日期。
要实现此规则,请在任务表的end_date列中添加NOT NULL约束。
首先,使用IS NULL运算符在end_date列中查找具有NULL的行:
SELECT * FROM tasks WHERE end_date IS NULL;
该查询返回了一行end_date中带有NULL的行。
其次,将NULL值更新为非null值。
在这种情况下,您可以制定一个规则,如果end_date为NULL,则结束日期为开始日期之后的一周。
UPDATE tasks SET end_date = start_date + 7 WHERE end_date IS NULL;
此查询验证更新:
SELECT * FROM tasks;
第三,使用以下ALTER TABLE语句将NOT NULL约束添加到end_date列:
ALTER TABLE table_name CHANGE old_column_name new_column_name column_definition;
在这种情况下,旧列名和新列名的名称相同,只是该列必须具有NOT NULL约束:
ALTER TABLE tasks CHANGE end_date end_date DATE NOT NULL;
让我们使用DESCRIBE语句验证更改:
DESCRIBE tasks;
如您所见,NOT NULL约束已成功添加到end_date列。
删除一个非空约束
要为列删除NOT NULL约束,请使用ALTER TABLE..MODIFY语句:
ALTER TABLE table_name MODIFY column_name column_definition;
请注意,列定义(column_definition)必须重新声明没有NOT NULL约束的原始列定义。
例如,以下语句从任务表的end_date列中删除NOT NULL约束:
ALTER TABLE tasks MODIFY end_date end_date DATE NOT NULL;
为了确保该语句实际上删除了NOT NULL约束,可以使用SHOW CREATE TABLE命令查看完整的列定义:
请注意,DESCRIBE语句也可以做到这一点:
DESCRIBE tasks;
在本教程中,您学习了如何为列定义NOT NULL约束,如何向列添加NOT NULL约束以及如何从列中删除NOT NULL约束。