PostgreSQL Not-Null Constraint


PostgreSQL Not-Null Constraint

在本节中,我们将了解PostgreSQL NOT NULL 约束的工作原理,约束用于确保列的值不为空。

例子中的PostgreSQL的NOT NULL约束,如何声明PostgreSQL的NOT NULL约束,并添加NOT NULL约束到现有列

在了解 PostgreSQL NOT NULL 约束的概念之前,我们先来了解一下 Null。

什么是空?

NULL用于表示未知或遗漏信息。它与数据库理论中的空字符串或数字零不同。

例如,如果我们想将客户的手机号码插入到一个特定的表中,我们可以请求他/她的手机号码。但是如果我们不知道客户是否有手机号码,我们可以在手机号码列中插入NULL 。

在这种情况下,NULL 指定手机号码在记录时未知。

NULL 非常重要,因为它不等同于任何东西,甚至它本身,正如我们在下面的表达式中所观察到的:

NULL = NULL

上面的语句将返回NULL,因为两个未识别的值不应该相等是有意义的。

如果我们想检查值是否为 NULL,我们可以使用IS NULL布尔运算符。例如,如果手机号码列的值为NULL 则以下语句返回 true 。

Mobile_number IS NULL

笔记:

  • IS NOT NULL操作相矛盾的输出IS NULL
  • 我们永远不应该使用 (=)相等运算符将值与NULL进行比较,因为它总是返回NULL

什么是 PostgreSQL Not-Null Constraint?

在PostgreSQL 中,not-null 约束是一个列,默认情况下可以保存Null值。如果我们不希望一列有 NULL 值,我们需要解释对这个列状态的这种约束,现在 NULL 对该特定列是不可接受的。

not null 约束总是作为列约束创建,它代表未知数据,但并不意味着数据应该为null

换句话说,我们可以说PostgreSQL Not-Null Constraint用于确保列不能有任何空值。

它是一个不能用作表约束列约束,这意味着不能指定名称来创建Not-Null Constraint。我们可以将Not-Null Constraint直接放在数据类型之后。

PostgreSQL Not-Null Constraint的语法

在下图中,我们将使用 NOT NULL 约束来检查列是否可以接受 NULL 值:

CREATE TABLE table_name(  
   ...  
 column_name data_type NOT NULL,  
   ...  
);

注意:如果列包含 NOT NULL 约束,或者我们试图在列中插入或更新 NULL,它将在输出中发出错误。

PostgreSQL NOT NULL 约束示例

要了解PostgreSQL Not-Null Constraint的工作原理我们将看到以下示例,该示例描述了PostgreSQL中如何使用NOT NULL 约束

在下面的命令中,我们将使用CREATE命令的帮助创建一个新表作为Bills\,并使用INSERT命令插入一些值。

要将账单\创建到Javatpoint 数据库中,我们将使用包含各种列(例如Bill_id、Item_id、Quantity、Actual_price列)的CREATE命令。

CREATE TABLE Bills(  
 Bill_id SERIAL PRIMARY KEY,  
  Item_id INT NOT NULL,  
  Quantity NUMERIC NOT NULL CHECK(Quantity > 0),  
  Actual_price NUMERIC CHECK(Actual_price > 0)   
);

输出

执行上述命令时,我们将收到以下消息:Bills\表已成功创建到Jtp数据库中。

PostgreSQL Not-Null Constraint

在上面的示例中,我们在Item_idQuantity列的数据类型之后使用了NOT NULL关键字来表示NOT NULL约束。

笔记:

  • 在 PostgreSQL 中,列可以包含各种约束,例如 CHECK、FOREIGN KEY、UNIQUE KEY 和NOT NULL,它们彼此相邻。
  • PostgreSQL 可以以任何顺序控制约束列表,因为约束的顺序并不重要。
  • 默认情况下,如果我们没有定义NOT NULL 或 NULL,它接受NULL 值

使用 ALTER TABLE 命令向现有列添加 PostgreSQL NOT NULL 约束

在 PostgreSQL 中,我们可以使用ALTER TABLE命令的帮助将NOT NULL 约束添加到现有表的列中。

使用 ALTER table 命令添加Not-Null Constraint的语法

下图ALTER TABLE命令用于将 NOT NULL 约束添加到现有表中:

ALTER TABLE table_name  
ALTER COLUMN column_name   
SET NOT NULL;

或者

如果我们想向各个列添加几个 NOT NULL 约束,我们可以使用以下语法:

ALTER TABLE table_name  
ALTER COLUMN column_name_1 SET NOT NULL,  
ALTER COLUMN column_name_2 SET NOT NULL,  
...;

使用 ALTER TABLE 命令的 PostgreSQL Not Null 约束示例

要了解PostgreSQL NOT NULL 约束的工作原理我们将看到以下示例,该示例描述了如何通过PostgreSQL 中的ALTER table命令添加NOT NULL 约束

在下面的示例中,我们将在Jtp数据库中创建一个名为Orders\的新表。

在创建Orders表之前,如果Jtp数据库中存在类似的表,我们将使用DROP TABLE命令。

DROP TABLE IF EXISTS Orders;

输出

执行上述命令后,我们会得到如下窗口信息,显示Orders\表已经删除成功。

PostgreSQL Not-Null Constraint

删除先前创建的Orders\表后,我们将创建一个新的Orders\表,其中包含各种列,例如ID、Specification、Raw_material_id、Quantity、Begin_id 和 End_id 列。

CREATE TABLE Orders (  
    ID SERIAL PRIMARY KEY,  
    Specification VARCHAR (50) NOT NULL,  
    Raw_material_id VARCHAR (15),  
    Quantity NUMERIC,  
    Begin_date DATE,  
    End_date DATE  
);

输出

执行上述命令后,我们会得到如下信息:Orders\表已成功创建到Jtp数据库中。

PostgreSQL Not-Null Constraint

一旦订单\表创建成功,我们将在INSERT命令的帮助下向其中插入几条记录,如以下命令所示:

INSERT INTO Orders (Specification)  
VALUES('Make for TCS');

输出

在执行上述命令时,我们将得到以下消息窗口,其中显示一个值已成功插入到Orders\表中。

PostgreSQL Not-Null Constraint

之后,我们可以在Quantity列中添加Not-Null Constraint,以确保Quantity列不为空,尽管该列已经包含一些数据。

要将NOT NULL 约束添加到包含 NULL 值的列中,我们将按照以下步骤操作。

步骤1

首先,我们需要将NULL更新为 NOT-NULL,如以下语句所示:

UPDATE Orders  
SET Quantity = 1;

输出

执行上述命令后,我们将得到如下消息窗口,显示订单\表已成功更新。

PostgreSQL Not-Null Constraint

正如我们在上面的屏幕截图中看到的,Quantity列中的值更新为 1。

第2步

现在,我们将使用 ALTER table 命令将NOT NULL 约束添加到Quantity列,如下面的语句所示:

ALTER TABLE Orders   
ALTER COLUMN Quantity  
SET NOT NULL;

输出

在执行上述命令时,我们将得到以下消息窗口,表明Orders\表已成功修改。

PostgreSQL Not-Null Constraint

Step3

之后,我们将借助以下命令更新Raw_material_id、Begin_date 和 End_date列的Not-Null Constraint:

UPDATE Orders  
SET Raw_material_id = 'PQR',  
 Begin_date = '2013-04-08',  
 End_date = '2013-04-08';

输出

执行上述命令后,我们将看到以下消息窗口,显示订单\表已成功更新:

PostgreSQL Not-Null Constraint

第四步

之后,我们将向各个列添加Not-Null 约束,如下面的语句所示:

ALTER TABLE Orders   
ALTER COLUMN Raw_material_id SET NOT NULL,  
ALTER COLUMN Begin_date SET NOT NULL,  
ALTER COLUMN End_date SET NOT NULL;

输出

执行上述命令时,我们将检索以下消息窗口,该窗口显示特定表已成功更改。

PostgreSQL Not-Null Constraint

第五步

最后,我们将尝试将Quantity列中的值修改为NUL L,因为我们可以观察到以下语句:

UPDATE Orders  
SET Quantity = NULL;

输出

执行上述命令后,PostgreSQL 发出以下错误消息:

错误:“数量”列中的空值违反了Not-Null Constraint详细信息:失败的行包含(1,为 TCS 制作,PQR,空,2013-04-08,2013-04-08)。

PostgreSQL Not-Null Constraint

NOT NULL 约束的不同情况

除了PostgreSQL Not Null Constraint 之外,我们还可以使用CHECK 约束来强制接受接受 NULL 值的列,NOT NULL 约束等于下面的 CHECK 约束:

CHECK(column IS NOT NULL)

让我们看一个示例示例,以了解 PostgreSQL Not Null Constraint 的特殊情况。

假设我们希望买家\表的Login_name 或 Phone_number不为 Null或为。在这种情况下,我们可以使用CHECK 约束

为此,首先,我们将借助Create Table 命令的帮助创建买方\表,如以下命令所示:

CREATE TABLE Buyer (  
ID serial PRIMARY KEY,  
Login_name VARCHAR (40),  
Password VARCHAR (40),  
Phone_number VARCHAR (40),  
CONSTRAINT Login_name_Phone_number_notnull CHECK (  
   NOT (  
     (Login_name IS NULL OR  Login_name = '' )  
     AND  
     ( Phone_number IS NULL  OR  Phone_number = '' )  
   )  
 )  
);

输出

执行完上面的命令后,我们会得到下面的消息窗口,显示Buyer\表已经成功创建到jtp数据库中。

PostgreSQL Not-Null Constraint

成功创建作为买方\的新表后,我们将在INSERT命令的帮助下向其中输入一些值。

INSERT INTO Buyer (Login_name, Phone_number)  
VALUES  
    ('Login1', NULL),  
    (NULL, '9876543210'),  
    ('Login2,'0123456789'),  
    ('Login3', '');

输出

执行上述命令后,我们会得到如下消息窗口,显示四个值已成功插入到Buyer\表中。

PostgreSQL Not-Null Constraint

但是下面的命令将不起作用,因为它会中断CHECK 约束

INSERT INTO Buyer (Login_name, Phone_number)  
VALUES   
(NULL, ''),  
(NULL, NULL),   
('', ''),  
('', NULL);

输出

执行上述命令后,PostgreSQL 将引发以下错误:

错误:关系“买家”的新行违反了检查约束“login_name_phone_number_notnull”详细信息:失败的行包含(5,空,空,)。

PostgreSQL Not-Null Constraint

概述

PostgreSQL Not-Null Constraint部分,我们学习了以下主题:

  • 我们使用了NOT NULL 约束来确保列的值不为空。
  • 我们已经了解了 PostgreSQL NOT NULL 约束的不同情况。
  • 要检查值为NULL与否,我们已经使用了IS NULL操作,其中IS NOT NULL否认的输出IS NULL