生成具有固定长度(包括日期和时间)的自动增量ID?

时间:2019-07-15 23:20:36

标签: oracle12c

我正在使用 oracle 12c

我需要在表中生成一个默认值作为唯一ID(PK)。此值的长度应固定为16位。格式应类似于“ YYYYMMDDHHmmXXXX”。最后一部分XXXX应该从“ 0001”到“ 9999”递增。另外,XXXX部分应重置为每分钟0001

如何生成这样的ID?

1 个答案:

答案 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。请注意此实现的性能和锁定问题。