我正在尝试创建一个触发器,用于计算插入后添加到表中的行数。触发器编译并抛出没有错误,但我的计数器表中没有任何内容显示我的计数。
这是我的测试表结构:
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;
得到一张空桌子。思考??
答案 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;