我们知道,在oracle中自动增长类型是依靠sequence类实现的,但是我们在插入一条数据时不能像sqlServer或者mySql中那么方便必须使用sequence.nextval来取得输入的值,能不能做到和Sqlserver一样吗,比如有表:
create table EMP
(
EMPID NUMBER(4) not null,
EMPNAME VARCHAR2(4000),
EMPPASS VARCHAR2(4000),
EMPSEX NUMBER(1),
EMPLEVELID NUMBER(4),
EMPLASTLOGINTIME DATE
)
alter table EMP
add constraint EMP_PK primary key (EMPID)
然后有一个序列:
create sequence EMP_SEQ
minvalue 1
maxvalue 9999999999
start with 10
increment by 1
cache 20;
我们现在的问题是:能不能把序列EMP_SEQ与表自动绑定起来实现插入时的方便呢?
正常的插入语句是这样的:
insert into EMP (EMPID, EMPNAME, EMPPASS, EMPSEX, EMPLEVELID, EMPLASTLOGINTIME) values (emp_seq.nextval(),'Jerry','jerry',1,3,to_date('01-04-2007 12:41:21', 'dd-mm-yyyy hh24:mi:ss')
自动绑定之后应该是这样的:
insert into EMP
(EMPNAME, EMPPASS, EMPSEX, EMPLEVELID, EMPLASTLOGINTIME)
values ('tom', '202cb962ac59075b964b07152d234b70', 1, 6, to_date('01-04-2007 22:41:21', 'dd-mm-yyyy hh24:mi:ss'));
解决方法是:
在EMP表的插入时做一个触发器,自动修改插入的EMPID的值:
create or replace trigger "BI_EMP"
before insert on "EMP"
for each row
begin
select "EMP_SEQ".nextval into :NEW.EMPID from dual;
end;
这样就可以达到我们想要的效果。插入时就可以写成:
insert into EMP
(EMPNAME, EMPPASS, EMPSEX, EMPLEVELID, EMPLASTLOGINTIME)
values ('tom', '202cb962ac59075b964b07152d234b70', 1, 6, to_date('01-04-2007 22:41:21', 'dd-mm-yyyy hh24:mi:ss'));
要注意的是:由于使用触发器在自动插入empid因此在插入时上面黑体部分内容不能省略,如果省略,依然需要手工添加一个empId的值,才能正常插入,也就是说,必须这样:
insert into EMP values (任意整数值,'Jerry','jerry',1,3,to_date('01-04-2007 12:41:21', 'dd-mm-yyyy hh24:mi:ss')
否则无法正常运行,很明显这样做复杂了程序的可读性。