You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL的smallserial、serial、bigserial为何从1开始自增?

PostgreSQL自增类型默认从1开始的原因及相关问题解答

一、默认从1开始的逻辑背景

PostgreSQL的smallserial、serial、bigserial本质是自动创建序列+整数列+默认值绑定序列的语法糖,而PostgreSQL的序列默认起始值就是1,核心逻辑来自两方面:

  • 沿用传统关系型数据库的设计习惯:自增主键多用于标识实体的唯一编号,从1开始更符合人类的自然计数直觉(比如第1条、第2条记录),和业务场景的编号逻辑更匹配,而非程序数组的0索引逻辑。
  • 规避语义冲突:0是有效的整数值,很多业务场景中0会被用作特殊标识(比如“未分配”“默认项”),从1开始可以减少这类业务语义与自增ID的混淆。

二、其他数据库的规则对比

不同数据库的自增起始值默认规则有差异,但多数主流数据库默认从1开始:

  • MySQL:AUTO_INCREMENT默认起始值为1。
  • SQL Server:IDENTITY默认起始值为1。
  • SQLite:AUTOINCREMENT默认从1开始,普通INTEGER PRIMARY KEY也会自动从1自增。
  • Oracle:无直接自增类型,常用序列实现,序列默认起始值同样是1。

三、pgAdmin 4与纯SQL创建的差异

不管是用pgAdmin 4可视化创建表,还是用纯SQL定义serial类类型,默认起始值都是1——这不是工具的问题,是PostgreSQL本身的序列默认规则决定的。

如果需要从0开始自增,可以手动修改序列或自定义序列绑定:

方法1:创建表后修改序列

CREATE TABLE test (
    id serial PRIMARY KEY,
    name varchar(50)
);
-- 修改序列起始值为0
ALTER SEQUENCE test_id_seq RESTART WITH 0;

方法2:手动创建序列并绑定列

CREATE SEQUENCE test_id_seq START WITH 0;
CREATE TABLE test (
    id integer PRIMARY KEY DEFAULT nextval('test_id_seq'),
    name varchar(50)
);
-- 绑定序列到列,确保删除表时序列同步删除
ALTER SEQUENCE test_id_seq OWNED BY test.id;

内容的提问来源于stack exchange,提问作者ozan deniz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:00:56