Oracle触发编译但没有发生任何事情?

时间:2017-05-05 17:02:29

标签: database oracle triggers

我正在尝试创建一个触发器,用于计算插入后添加到表中的行数。触发器编译并抛出没有错误,但我的计数器表中没有任何内容显示我的计数。

这是我的测试表结构:

create table gene_presence(genome_id VARCHAR2(20), gene_id VARCHAR2(15), primary key(genome_id,gene_id) );

这是我的代码,用于制作表格以及随着表格(gene_presence)更新而增加和减少的触发器:

CREATE TABLE genes_in_genomes(
    gene_id varchar2(15),
    counter number (30));

INSERT INTO genes_in_genomes select count(*) as gene_count, gene_id as gene
from gene_presence
group by gene_id;

select * from genes_in_genomes; 

create or replace trigger gene_in_genome_counter after insert on gene_presence
for each row
begin 
    update genes_in_genomes set counter= counter+1 
    where gene_id= :new.gene_id;
end;
/
create or replace trigger gene_in_genome_dec after update on gene_presence
for each row
begin
    update genes_in_genomes set counter=counter-1 
    where gene_id=:old.gene_id;
    update genes_in_genomes set counter= counter+1 
    where gene_id=:new.gene_id;
end; 
/

然后我将数据插入gene_presence:

insert into gene_presence values('1072459.4', 'group_10297');
insert into gene_presence values('1411691.4',   'group_10297');
insert into gene_presence values('316407.9',    'group_10297');
insert into gene_presence values('316407.41',   'group_10297');

并尝试检查genes_in_genomes中的内容:

select * from GENES_IN_GENOMES;

得到一张空桌子。思考??

1 个答案:

答案 0 :(得分:1)

使用触发器更新计数或维护任何agregate几乎总是错误的。如果选择计数需要快速,请使用视图,物化视图。

您的触发器只有update个语句。如果gene_id中不存在:new.gene_id匹配genes_in_genomes,则update将更新零行。零行update不是错误。

使用merge插入genes_in_genomes

回应评论询问观点:

CREATE VIEW genes_in_genomes AS
SELECT gene_id varchar2(15), COUNT(*) AS counter
FROM gene_presence
GROUP BY gene_id;