MySQL NOT NULL Constraint

摘要:在本教程中,您将学习如何为列定义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值的规则。换句话说,如果您更新插入NULLNOT 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约束显式定义titlestart_date列。 id列具有PRIMARY KEY约束,因此,它隐式包含NOT NULL约束。

end_date列可以有NULL值,假设当您创建新任务时,您可能不知道该任务何时可以完成。

在表的每一列中都使用NOT NULL约束是一个很好的做法,除非您有充分的理由不这样做。

通常, NULL值会使您的查询更加复杂,因为您必须使用ISNULL()IFNULL()NULLIF()等函数来处理NULL

向现有列添加NOT NULL约束

通常,您在创建表时向列添加NOT NULL约束。有时,您想要向现有表的可 NULL 列添加NOT NULL约束。在这种情况下,您可以使用以下步骤:

  1. 检查列的当前值是否有NULL
  2. 如果NULLs存在,则将NULL更新为非NULL
  3. 使用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)
MySQL NOT NULL Constraint example

查询返回一行end_date中包含NULL的行。

其次,将NULL更新为非空值。在这种情况下,您可以制定一个规则,如果end_dateNULL ,则结束日期为开始日期后一周。

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)
MySQL NOT NULL Update NULL values

第三,使用以下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)
MySQL NOT NULL - Add to existing column

如您所见, 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命令查看完整的列定义:

MySQL NOT NULL 约束 - 删除示例
请注意, DESCRIBE语句也可以实现这一目的:
描述任务;

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

本教程有帮助吗?