工作中经常需要生成指定格式的ID,例如:学生ID--S20200039,基金代码--F20023等。这种字符+数字格式的ID类手动数据有点麻烦。今天我跟大家分享用创建序列后,再通过触发器自动生成上述混合格式的ID的方法。当然这是我经常用的一种方法,如果大家有其他方法或者对于我下面分享的内容有更好的意见建议,在评论区留言讨论。

首先我创建了学生信息表sut_info,如下:

stu_info

stu_id

stu_name

stu_age

stu_sex

S2020001 

Rose  

18

famale

表中stu_id是S+7位数字组成,在后面创建序列的时候注意这一点。

第一步,创建数据表,代码如下:

create table stu_info(
                      stu_id    varchar2(16) not null primary key
                     ,stu_name  varchar2(32)
                     ,stu_age   number(8)
                     ,stu_sex   varchar2(8)
                     );

第二步,创建序列号seq_stu_id,代码如下:

/*为stu_id创建序列*/
create sequence seq_stu_id
       start with 2020000
       nocache;

查看序列值的方法  序列名.nextval(查看下一个值)或者   序列名.currval(查看当前值)。  这里要注意的是查看序列的初始值要先用nextval,如果对于初始值用currval会报错。比如:查看上面创建序列的初始值的代码如下:

/*验证序列*/
select seq_stu_id.nextval from dual;

查询结果为:

NEXTVAL

2020000

 

 

 

第三步,创建触发器,实现对stu_info 表添加数据的时候用序列值自动生成学生id,代码如下:

/*创建触发器实现对stu_info表添加数据的时候,通过序列号自动生成stu_id,形式为:S+7位数字*/
create or replace trigger int_stu_id
          before insert
          on stu_info
          for each row
          begin
            select 'S'||seq_stu_id.nextval into:new.stu_id from dual;
          end int_stu_id;

下面对stu_info 表插入数据看看。

插入数据代码:

/*插入数据测试触发器*/
insert into stu_info(stu_name,stu_age,stu_sex)values('Rose',18,'famale');
insert into stu_info(stu_name,stu_age,stu_sex)values('Tom',19,'male');

上面插入了两行代码,可以看出来,插入数据的时候没有插入了stu_id字段,下面查看表:

/*查看表数据*/
select * from stu_info;

查询结果如下:

STU_ID

STU_NAME

STU_AGE

STU_SEX

S2020000

Rose

18

famale

S2020001

Tom

19

male

 

 

 

 

从查询结果可以看出,我们添加数据的时候触发器被触发,并调用序列值按指定格式给stu_info表的stu_id字段自动插入学生id。

 

 

(注:上述代码是oracle 11g下运行,如果你用的是其他数据库注意在触发器里的序列和字母S的拼接,比如mysql下要用concat()函数实现拼接。)