提要:在本教程中,你将学到通过 NOT NULL 约束来限定某个字段的值不能为 NULL。

在数据库理论中,NULL 代表未知的或丢失的信息。中文翻译为 空值NULL 值不同于空字符或零。比如,我们想获取某人的 Email 地址。如果并不知道他的 Email 地址,就可以使用 NULL 值。相应的,如果他没有 Email,那么可以设置为空字符。

NULL 值是非常特殊的。NULL 和其它的 NULL 并不相等(即是说, NULL = NULL 返回 false)。要判断一个值是否为 NULL,需要使用 IS NULLIS NOT NULL

PostgreSQL 提供了 NOT NULL 约束,用于限制某字段的值不能是 NULL

创建新表时添加 NOT NULL 约束

下面的语句用于创建包含 NOT NULL 约束的 invoice 表:

CREATE TABLE invoice(
  id serial PRIMARY KEY,
  product_id int NOT NULL,
  qty numeric NOT NULL CHECK(qty > 0),
  net_price numeric CHECK(net_price > 0) 
);

我们在字段的数据类型后面定义 NOT NULL 约束,这意味着,它是一个字段级的约束。

顺便一提,一个字段可以有多个约束。多个约束间的顺序无关紧要。

如果使用 NULL 代替 NOT NULL,那么,这个字段将同时接受 NULL 值和非 NULL 值。

给已存在的表添加 NOT NULL 约束

像下面这样,使用 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;

接下来,我们来看一个例子。

首先,创建一个名为 production_orders 的表:

CREATE TABLE production_orders (
 ID serial PRIMARY KEY,
 description VARCHAR (40) NOT NULL,
 material_id VARCHAR (16),
 qty NUMERIC,
 start_date DATE,
 finish_date DATE
);

然后,往这张表里插入数据:

INSERT INTO production_orders (description)
VALUES
 ('make for infosys inc.');

现在,我们想将 qty 字段设置为 NOT NULL。别急,这张表已经有一条记录了,而且这条记录里面的 qty 的值是 NULL。如果此时将其设置为 NOT NULL,将会报错。

所以,我们得把它条记录里的 qty 设置为非 NULL 值:

UPDATE production_orders
SET qty = 1;

然后,再加 NOT NULL 约束:

ALTER TABLE production_orders ALTER COLUMN qty
SET NOT NULL;

NOT NULL 特例

可以用 CHECK 约束 来表示 NOT NULL 约束:

NOT NULL

等效于:

CHECK(column IS NOT NULL)

这非常有用。因为有时候只想让字段 a 和字段 b 之间只有一个是非空,但不能两个都是非空。如下例的 users 表,我们只想让 usernameemail 不为空,可以使用下面的 CHECK 约束

CREATE TABLE users (
 id serial PRIMARY KEY,
 username VARCHAR (50),
 password VARCHAR (50),
 email VARCHAR (50),
 CONSTRAINT username_email_notnull CHECK (
 (
 username IS NOT NULL
 AND email IS NULL
 )
 OR (
 email IS NULL
 AND username IS NOT NULL
 )
 )
);
下一篇:PostgreSQL 外键