自动递增列,包括年份

时间:2018-02-14 14:48:53

标签: sql oracle oracle11g auto-increment

我需要创建一个带有ID列的表,该列自动递增并连接当前年份,例如:

year = 2018 ==> 20181 , 20182 , 20183 , etc
year = 2020 ==> 20201 , 20202 , 20203 , etc

我该怎么做?

3 个答案:

答案 0 :(得分:1)

首先创建一个序列:

CREATE SEQUENCE seq_myTable START WITH 1;

然后在触发器中使用它:

CREATE OR REPLACE TRIGGER Trg_myTable 
BEFORE INSERT ON myTable 
FOR EACH ROW
DECLARE
  v_year varchar2(4):=to_char(sysdate,'yyyy');
BEGIN
 :new.id := v_year||seq_myTable.nextval;
END;
/

答案 1 :(得分:1)

以下内容需要Oracle 12.1或更高版本:

create sequence demo_seq;

create table demo
( genid   varchar2(10) default on null to_char(sysdate,'YYYY')||demo_seq.nextval
          constraint demo_pk primary key
, somecol varchar2(10) );

insert into demo (somecol) values ('Kittens');
insert into demo (somecol) values ('Puppies');

select * from demo;

GENID      SOMECOL
---------- ----------
20181      Kittens
20182      Puppies

这里唯一的限制是序列不会每年重启。为了自动执行此操作,我认为您必须放弃序列并使用select max +1方法进行一些显式序列化(dbms_lock或类似)。或者,安排作业每年重新开始序列。

答案 2 :(得分:0)

我想没有这种方法可以将自动机制用作生成的Id。

我在这里看到几个选项:

  • 使用2列:Id和Year
  • 使用virtual column
  • 使用插入触发器中的函数来构建自定义ID

我建议在id列上使用2列和一个主键,在year列上使用一个索引,因为它是我能想到的最干净的实现(也许也是最快的)。 +你应该使用你的id作为id和另一列来查看它被添加的年份,或者如果你需要已经插入记录的信息,甚至是日期列

相关问题