1. 程式人生 > >oracle主鍵自增 建立多個觸發器

oracle主鍵自增 建立多個觸發器

問題:

最近修改專案的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; 
;
大家還是要根據自己專案的具體情況進行判斷,不要意味的百度。