我需要创建一个带有ID列的表,该列自动递增并连接当前年份,例如:
year = 2018 ==> 20181 , 20182 , 20183 , etc
year = 2020 ==> 20201 , 20202 , 20203 , etc
我该怎么做?
答案 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。
我在这里看到几个选项:
我建议在id列上使用2列和一个主键,在year列上使用一个索引,因为它是我能想到的最干净的实现(也许也是最快的)。 +你应该使用你的id作为id和另一列来查看它被添加的年份,或者如果你需要已经插入记录的信息,甚至是日期列