oracle数据库中创建序列并用序列自动生成ID或编号
工作中经常需要生成指定格式的ID,例如:学生ID--S20200039,基金代码--F20023等。这种字符+数字格式的ID类手动数据有点麻烦。今天我跟大家分享用创建序列后,再通过触发器自动生成上述混合格式的ID的方法。当然这是我经常用的一种方法,如果大家有其他方法或者对于我下面分享的内容有更好的意见建议,在评论区留言讨论。
首先我创建了学生信息表sut_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()函数实现拼接。)