Oracle查询中如何将SYSDATE与序列号拼接生成唯一ID
Oracle拼接序列号与日期生成唯一ID
当然可以用||运算符实现拼接,以下是调整后的查询语句:
SELECT (NVL(MAX(RII_INDENT_ID_SL), 0) + 1) || '-' || TO_CHAR(SYSDATE, 'DD/MM/YYYY') AS UNIQUE_ID FROM T_RAKE_INDENT_IBMD;
各部分说明:
NVL(MAX(RII_INDENT_ID_SL), 0) + 1:保留你原有的序列号生成逻辑,从表中取最大序号加1,确保序号递增TO_CHAR(SYSDATE, 'DD/MM/YYYY'):把系统日期格式化为你需要的日/月/年格式(对应示例中的23/09/2022)||:Oracle中的字符串拼接运算符,用来把序号、分隔符-和格式化后的日期拼接成最终的唯一ID字符串
额外提醒:
这种基于表最大值生成序号的方式,在多用户并发操作时可能会出现重复ID的问题(多个会话同时读取到相同的最大值,然后都加1生成重复序号)。如果是生产环境,更推荐用Oracle的序列(SEQUENCE)来生成可靠的自增序号:
-- 先创建序列(只需执行一次) CREATE SEQUENCE SEQ_RAKE_INDENT_ID START WITH 1 INCREMENT BY 1 NOCACHE; -- 生成带日期的唯一ID SELECT SEQ_RAKE_INDENT_ID.NEXTVAL || '-' || TO_CHAR(SYSDATE, 'DD/MM/YYYY') AS UNIQUE_ID FROM DUAL;
如果必须依赖表中现有数据生成序号,建议在事务中对表加锁(比如用SELECT ... FOR UPDATE),避免并发冲突。
内容的提问来源于stack exchange,提问作者Abhipsa Mohapatra
相关产品推荐
相关产品推荐

