MySQL NOT NULL约束

时间:2019-11-20 08:52:11  来源:igfitidea点击:

简介:在本教程中,您将学习如何为列定义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约束。