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、聚合、排序中的三值逻辑行为速查