# Oracle数据库中创建自动增长字段与报表结合 ## 业务背景        在报表的使用过程中经常要遇到需要新增一条信息,让新增信息的ID按照顺序增长,通常会想到用报表的流水号的功能,但是报表系统的流水号并不能提供并发功能,也就是说假设设定流水号的初值为ID字段的最大值100,但是当有甲乙两个人同时访问这张报表同时新增一条记录的时候两边报表的新增的ID值都为101,当甲新增完信息保存之后,乙新增保存101就会把甲保存的信息给覆盖,不能完成我们想要实现的效果。        这种情况就需要设置自增长,设置自增长的话mysql ,sqlserver有自增长字段,但是 oracle没有自增长字段,oracle在创建表时和其他的数据库有点不一样,如SQL SERVER可以在int类型的字段后加上identity(1,1),该字段就会从1开始,按照+1的方式自增,将这个字段设置为主键,有利于我们进行数据的插入操作。MySql中可以使用“auto_increment”即可。但是oracle有点麻烦,需要使用序列和触发器达到目的。 ## 具体步骤 ### 创建序列和触发器 首先我们创建一个员工表。 ```javascript create table employee( Id int , EmpNo number, Ename varchar2(16) ); ``` 其次,创建员工表自动增长序列。 ```javascript create sequence employ_autoinc minvalue 0 maxvalue 9999999999999999999999999999 start with 1 increment by 1 nocache; ``` 现在我们可以添加两条信息来测试一下 ![](/uploads/sjjc/images/m_25712b01bca239a6baac9568c00f15d7_r.png) 然后,创建触发器 ```javascript create or replace trigger insert_employee_autoinc before insert on employee for each row begin select employ_autoinc.nextval into :new.Id from dual; end; ``` 最后添加一条记录测试触发器 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_4a0f2e5252805452bf87dc82fca878f2_r.png) ### 报表设计 新建一个行式填报表,设置报表的填报属性的填报设置,然后设置A2,B2单元格的属性为可写 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_eee5b888dc726e38602a224cfe909d9a_r.png) 保存之后预览 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_bf8b3e75dd3578045baecf445061c8fa_r.png) 在这里我们新增一条记录。保存之后到数据库查看 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_5c42e546a549947969ea0b12037c0b67_r.png) 设置成功。