您的位置:首页 > 数据库 > Oracle

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

2017-04-26 19:02 260 查看
问题:

最近修改项目的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; ;
大家还是要根据自己项目的具体情况进行判断,不要意味的百度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: