跳到主要内容

PostgreSQL NOT NULL 与 DEFAULT 教程

NOT NULL 禁止列为空,DEFAULT 在插入未提供该列时自动填充。两者是保证数据完整性最常用的轻量约束。

本篇内容​

  • NOT NULL 约束与添加时的注意点
  • DEFAULT 常用值(常量、函数、表达式)
  • 添加列时带默认值的行为
  • NULL 的三值逻辑影响

NOT NULL​

CREATE TABLE users (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(50) NOT NULL,
-- 未提供值时填入默认时间
create_time TIMESTAMPTZ NOT NULL DEFAULT now()
);

DEFAULT​

CREATE TABLE orders (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
status SMALLINT NOT NULL DEFAULT 0,
-- 默认值可以是函数调用
create_time TIMESTAMPTZ NOT NULL DEFAULT now(),
-- 也可以是表达式
expire_time TIMESTAMPTZ DEFAULT now() + INTERVAL '7 days',
tags TEXT[] DEFAULT '{}'
);

修改默认值与非空​

-- 改默认值
ALTER TABLE orders ALTER COLUMN status SET DEFAULT 1;
-- 去掉默认值
ALTER TABLE orders ALTER COLUMN status DROP DEFAULT;
-- 设为非空(表中已有 NULL 时会失败,需先清理)
ALTER TABLE orders ALTER COLUMN status SET NOT NULL;
-- 去掉非空
ALTER TABLE orders ALTER COLUMN status DROP NOT NULL;
待补充(TODO)
  • 补充:大表加 NOT NULL 的在线方案(CHECK (col IS NOT NULL) NOT VALID → VALIDATE)
  • 补充:DEFAULT 与序列/Identity 的关系(自增列本质就是 DEFAULT nextval)
  • 补充:NULL 在 WHERE、聚合、排序中的三值逻辑行为速查