2017-05-05 38 views
0

我正在尝试做一个触发器来计算插入后添加到表中的行。触发器编译并且不会抛出任何错误,但是我的计数器表中没有显示我的计数。Oracle触发器编译,但没有发生?

这里是我的测试表结构:

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'); 

并尝试检查gene_in_genomes中的内容:

select * from GENES_IN_GENOMES; 

并得到一个空表。思考?

回答

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; 
+0

我完全同意你的看法。我有一个项目合作伙伴坚持它是一个触发器。你如何推荐这样做? – cobaltchaos

+1

首先,倾倒你的伴侣;) – APC