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 |
CREATE TABLE example (
count INTEGER NOT NULL,
status SMALLINT NOT NULL
);
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY
或:
id BIGINT GENERATED BY DEFAULT AS IDENTITY
id SERIAL
id BIGSERIAL
四、整数 vs 数值类型(重要区别)
| 类型 | 精度 | 性能 | 适用 |
|---|---|---|---|
| INTEGER | 固定 | ⭐⭐⭐⭐⭐ | ID / 计数 |
| NUMERIC | 任意 | ⭐⭐ | 金额 |
| FLOAT | 浮点 | ⭐⭐⭐⭐ | 科学计算 |
📌 ID / 数量永远不要用 NUMERIC
- 整数是 定长存储
- 比较、排序、JOIN 非常快
- 索引体积小
几乎可以忽略
- BIGINT 慢 < 5%
- 换来的是 未来安全
📌 新表直接 BIGINT
INT(11) -- PostgreSQL 不存在
PostgreSQL:
- INTEGER 没有长度
- 括号无效
code INTEGER -- ❌
如果是:
000591
应使用:
CHAR(6) / VARCHAR(6)
id SMALLINT PRIMARY KEY -- ❌
- 3 万条直接溢出
- 生产事故高发
CREATE INDEX idx_example_count ON example(count);
- B-Tree
- 效率最高
- 默认索引类型
CSV 示例:
id,count
1,100
2,200
- 纯数字
- 不要加引号(可以加,但没必要)
SELECT
typname,
typlen
FROM pg_type
WHERE typname IN ('int2', 'int4', 'int8');
PostgreSQL 的整数是定长、高性能类型
新表:BIGINT
状态值:SMALLINT
不要幻想 INT(11)