工作中經常需要生成指定格式的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()函數實現拼接。)