当前位置: 首页 > news >正文

PostgreSQL:生成-唯一主键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. 其他方法待续…

http://www.lryc.cn/news/458320.html

相关文章:

  • Swift添加自定义字体
  • Springboot 整合 Java DL4J 实现企业门禁人脸识别系统
  • SSTI模板注入+CTF实例
  • iPhone 16 Pro 拆解揭秘:设计改进与维修便利性
  • Java项目实战II养老||基于Java+Spring Boot+MySQL的社区智慧养老监护管理平台设计与实现(源码+数据库+文档)
  • 利用FnOS搭建虚拟云桌面,并搭建前端开发环境(二)
  • 【Python】Qwen-VL-7B box
  • echarts按需引入解决项目大小问题
  • 天气预报echarts
  • Kafka-初识
  • Redis的主要的特性和优势 ?
  • yolov5-7.0模型DNN加载函数及参数详解(重要)
  • StringEntity 用于将字符串内容作为 HTTP 请求实体(请求体)
  • 校园系统校园小程序 论坛校园圈系统失物招领、闲置二手、跑腿外卖等校园圈子系统应该具备有哪些功能
  • [AWS云]kafka调用和创建
  • 查看 Excel 应用程序中已打开的 Excel 文件的完整路径
  • 学习 RocketMQ 单机部署、消息发送、消息接收
  • 【计算机网络】CDN
  • 数据结构:插入排序
  • Nginx反向代理配置与负载均衡配置
  • axios 前端与 Django 后端的 POST 交互
  • 数据结构常用术语
  • Flask 轻松上手:从零开始搭建属于你的Web应用
  • [MyBatis-Plus]快速入门
  • 单例模式和读者写者问题
  • 内网wordpress更换IP后无法访问的解决办法
  • Spring Boot课程答疑:技术难题一网打尽
  • 云卷云舒【超级数据库】:算力网络时代的云原生数据库
  • 电脑分盘分盘
  • 四元数基础知识