oracle主键自增 创建多个触发器

问题:

最近修改项目的sql脚本,新增几张表,其中三个表需要属性自增,mySql中可以直接用AUTO_INCREMENT,oracle没有做自增功能,需要手动写触发器实现自增功能。在网上找到了解决方案。贴出来供大家参考:

解决方案:1.首先创建表

CREATE TABLE eip_monitor_statistics 
(
	pk INT NOT NULL, 
	system_pk char(36),
	service_pk char(36),
	system_name VARCHAR2(300),
	corppk CHAR(36),
	PRIMARY KEY (pk)
 ) 
 ;

2.创建sequence

create sequence monitor_statistics_seq 
minvalue 1 
maxvalue 99999999    
increment by 1
start with 1
;
3.创建触发器
create or replace trigger monitor_statistics_tri      
before  insert or update on eip_monitor_statistics   
for each row WHEN (new.pk is null)       
begin     
select  monitor_statistics_seq.nextval into :new.pk from dual;
end; 
;

到这里,大多数人的问题可能已经解决,下面是我卡了我两天的问题,因为sql初始化脚本中需要创建三个自增的触发器,下面是总结创建多个触发器的问题:

1.首先对于sequence和触发器到底是一一对应还是一对多的问题,最好还是一一对应,这样同一个表产生的主键是连续,否则是多张表共同使用一个sequence会造成数据不连贯。

2.多个触发器创建语句和一个触发器语法的不同处,在网上百度大家的解释都是在两个触发器末尾加‘/’,脚本中如果不加'/',造成数据库产生三个触发器但是触发器报错,点击编辑看到end后面的';'丢失,造成错误。代码如下

create or replace trigger comp_invoke_info_bak_tri      
before  insert or update on eip_comp_invoke_info_bak    
for each row WHEN (new.pk_comp_invoke_info is null)       
begin
select  comp_invoke_info_bak_seq.nextval into :new.pk_comp_invoke_info from dual;
end; 
/
create or replace trigger monitor_statistics_tri      
before  insert or update on eip_monitor_statistics   
for each row WHEN (new.pk is null)       
begin     
select  monitor_statistics_seq.nextval into :new.pk from dual;
end; 
/
这样试了一下我的问题还是没有解决,最后跟了项目的代码,执行脚本后对脚本的处理


分析得出结论,如果是加'/'后,执行continue,此行忽略,如果不加‘/’,后台处理是将每条creat的字段放在一个数组,但是会去掉‘;’,此时我是想要分号留在数据中保存的,最后处理的代码就是在下一行又加了分号,用处做结束语。代码如下:


create or replace trigger comp_invoke_info_bak_tri      
before  insert or update on eip_comp_invoke_info_bak    
for each row WHEN (new.pk_comp_invoke_info is null)       
begin
select  comp_invoke_info_bak_seq.nextval into :new.pk_comp_invoke_info from dual;
end; 
;
create or replace trigger monitor_statistics_tri      
before  insert or update on eip_monitor_statistics   
for each row WHEN (new.pk is null)       
begin     
select  monitor_statistics_seq.nextval into :new.pk from dual;
end; 
;
大家还是要根据自己项目的具体情况进行判断,不要意味的百度。




你可能感兴趣的:(db)