首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Oracle中向表值追加递增数字?

如何在Oracle中向表值追加递增数字?
EN

Stack Overflow用户
提问于 2022-07-25 12:02:48
回答 2查看 27关注 0票数 0

使用Oracle,我有一个创建唯一ID号的过程。目前,ID号是用sysdate年份与"-“连接起来的。然后,我更新ID号,以便在破折号之后从表中连接一个值。

例: 2022-8501。

我不使用表值,而是在破折号之后增加1,它应该从每年的1开始。

例: 2022-1,2022-2,2022-3 /(明年) 2023-1,2023-2,2023-3

什么是最好的方法来解决这个问题?我已将我目前的代码附在下面。

代码语言:javascript
复制
INSERT INTO PLANE_INFO.ID_NUMBERS (PLANE_ID)
    VALUES (TO_CHAR(SYSDATE, 'YYYY')||'-')
    RETURNING ENTRY_ID INTO v_entry_id;

UPDATE PLANE_INFO.ID_NUMBERS
    SET PLANE_ID = PLANE_ID || LPAD(v_entry_id,5,'0')
    WHERE ENTRY_ID = v_entry_id;
EN

回答 2

Stack Overflow用户

发布于 2022-07-25 12:12:08

“最好”的方式?用一个序列。

代码语言:javascript
复制
create sequence seq;

insert into plane_info.id_numbers (plane_id)
values (extract (year from sysdate) ||'-'|| seq.nextval);
票数 0
EN

Stack Overflow用户

发布于 2022-07-25 12:38:21

DR只是使用一个正常序列,如果您想生成每年重新启动的伪序列,那么您可以计算它以用于显示目的(但不应该使用它作为引用约束)。

如果你有桌子:

代码语言:javascript
复制
CREATE TABLE PLANE_INFO.ID_NUMBERS (
  id   NUMBER
       GENERATED ALWAYS AS IDENTITY
       CONSTRAINT table_name__id__pk PRIMARY KEY,
  year NUMBER(4)
       CONSTRAINT table_name__year__nn NOT NULL
);

注意:IDENTITY列可以从Oracle12中获得。

然后有一个递增序列(可以用作主键和任何引用约束)和一个年份列。

您可以使用ROW_NUMBER()解析函数和字符串连接生成伪序列(用于显示目的,而不是作为引用约束):

代码语言:javascript
复制
SELECT t.*,
       YEAR
       || '-'
       || LPAD(ROW_NUMBER() OVER (PARTITION BY YEAR ORDER BY id), 5, '0')
         AS pseudo_seq
FROM   PLANE_INFO.ID_NUMBERS t

db<>fiddle https://dbfiddle.uk/?rdbms=oracle_21&fiddle=e2a3d498f3effb6eb1493d17898c5776

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73108898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档