1. 通过时间戳和随机数拼接生成
select TO_CHAR(NOW(), 'YYYYMMDDHH24MISS') || LPAD(FLOOR(RANDOM() * 1000000)::TEXT, 6, '0') AS unique_id
解析:
-
TO_CHAR(NOW(), ‘YYYYMMDDHH24MISS’):该部分将当前时间 (NOW()) 格式化为 YYYYMMDDHH24MISS 格式,即年(YYYY)、月(MM)、日(DD)、小时(24小时制,HH24)、分钟(MI)、秒(SS)。
示例输出:20241008153025(表示 2024 年 10 月 8 日 15:30:25)。
RANDOM() * 1000000: -
RANDOM() :生成 0 到 1 之间的随机浮点数,乘以 1000000 后,可以得到一个 0 到 999999 之间的随机数。
FLOOR(RANDOM() * 1000000): -
FLOOR :将随机数向下取整,保证它是一个整数。
示例输出:573821。
LPAD(FLOOR(RANDOM() * 1000000)::TEXT, 6, ‘0’): -
LPAD(左侧填充)确保随机数总是由 6 位数字组成。如果随机数的位数不足 6 位,则在左侧用 0 补齐。
示例:如果生成的数字是 23789,则通过 LPAD 补齐为 023789。 -
||(字符串拼接):将时间戳部分与随机数部分拼接在一起,形成唯一的标识符。
最终输出:
- 该 SQL 查询会生成一个由当前时间戳和 6 位随机数组合成的唯一 ID。
例如:20241008153025023789
2. 使用PostgreSQL 支持的标准函数-生成 UUID
简介:
- UUID(Universally Unique Identifier)是一个128位的标识符,可以保证生成的ID在全球范围内唯一。PostgreSQL 支持生成 UUID 的标准函数。
使用:
-
uuid_generate_v4()函数
-- 创建拓展 create extension "uuid-ossp"; -- 生成UUID值 SELECT uuid_generate_v4() AS unique_id;
说明:
- 这里需要先创建 uuid-ossp 扩展,
执行命令create extension "uuid-ossp"
; 才能使用函数uuid_generate_v4()
这一步注意是否拥有权限,需要权限高的账号才能创建。 - 特点:
UUID v4 是基于随机数生成的,通常表示为 36 个字符的字符串(包括连字符),例如:550e8400-e29b-41d4-a716-446655440000。
- 这里需要先创建 uuid-ossp 扩展,
-
gen_random_uuid()函数
-- 创建拓展 create extension "pgcrypto"; -- 生成UUID值 SELECT gen_random_uuid() AS unique_id;
说明:
- 这里需要先创建 pgcrypto 扩展,
执行命令create extension "pgcrypto"
; 才能使用函数gen_random_uuid()
这一步注意是否拥有权限,需要权限高的账号才能创建。
- 这里需要先创建 pgcrypto 扩展,
说明:
- postgresql 官方文档:如果只是使用随机的uuid, 建议使用 pgcrypto 扩展的 gen_random_uuid() 。
详见:https://www.postgresql.org/docs/current/uuid-ossp.html
3. 数据库序列实现数字递增
简介:
- 数据库序列是生成唯一递增数字的一种方式,适合用于单机或少量并发环境。PostgreSQL 内置了 SERIAL 和 BIGSERIAL 类型,自动生成自增主键。
使用方法:
使用:
-- 创建一个新的序列对象
CREATE SEQUENCE order_seq START 1;
-- 获取递增值
SELECT nextval('order_seq') AS unique_id;
特点:
- 序列号是连续的、递增的整数,例如:1, 2, 3…。
- 优点:
整数类型占用空间小,性能高。
生成顺序ID,便于排序和索引。 - 缺点:
在分布式环境中可能会有冲突。
需要依赖数据库状态。