我正在使用 oracle 12c 。
我需要在表中生成一个默认值作为唯一ID(PK)。此值的长度应固定为16位。格式应类似于“ YYYYMMDDHHmmXXXX
”。最后一部分XXXX
应该从“ 0001
”到“ 9999
”递增。另外,XXXX
部分应重置为每分钟0001
。
如何生成这样的ID?
答案 0 :(得分:0)
我不想讨论您的主键生成方法有多好,但是我认为可以使用触发器来实现:
create table myTest
(
id varchar2(16) primary key,
val number
);
create index imyTest01 on mytest(substr(id, 1, 12), substr(id, 13));
CREATE OR REPLACE TRIGGER myTest_trg before insert on myTest for each row
begin
lock table mytest in exclusive mode; --If you have concurrent Inserts
select to_char(sysdate, 'YYYYMMDDHHMI')||lpad(((nvl(max(to_number(substr(id, 13))), 0))+1), 4, '0')
into :new.id
from myTest
where substr(id, 1, 12) = to_char(sysdate, 'YYYYMMDDHHMI');
end;
--Testing:
begin
for i in 1 .. 1000 loop
insert into mytest(val) values(i);
end loop;
end;
也可以将其修改为使用Numbers代替Varchar作为PK。请注意此实现的性能和锁定问题。