使用Oracle,我有一个创建唯一ID号的过程。目前,ID号是用sysdate年份与"-“连接起来的。然后,我更新ID号,以便在破折号之后从表中连接一个值。
例: 2022-8501。
我不使用表值,而是在破折号之后增加1,它应该从每年的1开始。
例: 2022-1,2022-2,2022-3 /(明年) 2023-1,2023-2,2023-3
什么是最好的方法来解决这个问题?我已将我目前的代码附在下面。
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;发布于 2022-07-25 12:12:08
“最好”的方式?用一个序列。
create sequence seq;
insert into plane_info.id_numbers (plane_id)
values (extract (year from sysdate) ||'-'|| seq.nextval);发布于 2022-07-25 12:38:21
DR只是使用一个正常序列,如果您想生成每年重新启动的伪序列,那么您可以计算它以用于显示目的(但不应该使用它作为引用约束)。
如果你有桌子:
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()解析函数和字符串连接生成伪序列(用于显示目的,而不是作为引用约束):
SELECT t.*,
YEAR
|| '-'
|| LPAD(ROW_NUMBER() OVER (PARTITION BY YEAR ORDER BY id), 5, '0')
AS pseudo_seq
FROM PLANE_INFO.ID_NUMBERS tdb<>fiddle https://dbfiddle.uk/?rdbms=oracle_21&fiddle=e2a3d498f3effb6eb1493d17898c5776
https://stackoverflow.com/questions/73108898
复制相似问题