生成-唯一主键id

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。
  • gen_random_uuid()函数

    -- 创建拓展
    create extension "pgcrypto";
    -- 生成UUID值
    SELECT gen_random_uuid() AS unique_id;
    

    说明:

    • 这里需要先创建 pgcrypto 扩展,
      执行命令create extension "pgcrypto"; 才能使用函数gen_random_uuid()
      这一步注意是否拥有权限,需要权限高的账号才能创建。

说明:

  • 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,便于排序和索引。
  • 缺点:
    在分布式环境中可能会有冲突。
    需要依赖数据库状态。

4. 其他方法待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值