Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

PostgreSQL 整数

内容:类型对比、范围、存储、性能、最佳实践、常见坑。

一、PostgreSQL 整数类型一览(核心表)

类型 别名 字节 范围
SMALLINT INT2 2 -32,768 ~ 32,767
INTEGER INT / INT4 4 -2,147,483,648 ~ 2,147,483,647
BIGINT INT8 8 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

📌 没有 INT1 / INT16

二、如何选择整数类型(结论先行)

推荐规则(直接照用)

场景 推荐类型
表主键 / ID BIGINT
行数 < 20 亿 INTEGER
状态码 / 枚举 SMALLINT
计数 / 自增 BIGINT
跨系统数据 BIGINT

三、建表示例(标准写法)

1️⃣ 普通整数列

CREATE TABLE example (
    count INTEGER NOT NULL,
    status SMALLINT NOT NULL
);

2️⃣ 自增整数(PostgreSQL 10+ 推荐)

id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY

或:

id BIGINT GENERATED BY DEFAULT AS IDENTITY

3️⃣ 旧写法(不推荐新项目)

id SERIAL
id BIGSERIAL

四、整数 vs 数值类型(重要区别)

类型 精度 性能 适用
INTEGER 固定 ⭐⭐⭐⭐⭐ ID / 计数
NUMERIC 任意 ⭐⭐ 金额
FLOAT 浮点 ⭐⭐⭐⭐ 科学计算

📌 ID / 数量永远不要用 NUMERIC

五、整数存储与性能(你必须知道)

1️⃣ 存储固定、比较快

  • 整数是 定长存储
  • 比较、排序、JOIN 非常快
  • 索引体积小

2️⃣ INTEGER vs BIGINT 性能差距?

几乎可以忽略

  • BIGINT 慢 < 5%
  • 换来的是 未来安全

📌 新表直接 BIGINT

六、常见坑(你很可能踩过)

❌ 1️⃣ MySQL 风格的 INT(11)

INT(11)  -- PostgreSQL 不存在

PostgreSQL:

  • INTEGER 没有长度
  • 括号无效

❌ 2️⃣ 数字前导零

code INTEGER -- ❌

如果是:

000591

应使用:

CHAR(6) / VARCHAR(6)

❌ 3️⃣ 用 SMALLINT 当主键

id SMALLINT PRIMARY KEY -- ❌
  • 3 万条直接溢出
  • 生产事故高发

七、整数索引最佳实践

CREATE INDEX idx_example_count ON example(count);
  • B-Tree
  • 效率最高
  • 默认索引类型

八、整数与 COPY / 导入

CSV 示例:

id,count
1,100
2,200
  • 纯数字
  • 不要加引号(可以加,但没必要)

九、查看整数类型信息

SELECT
    typname,
    typlen
FROM pg_type
WHERE typname IN ('int2', 'int4', 'int8');

十、总结

PostgreSQL 的整数是定长、高性能类型

新表:BIGINT

状态值:SMALLINT

不要幻想 INT(11)