2017-05-05 86 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