oracle主鍵自增 建立多個觸發器
阿新 • • 發佈:2019-02-06
問題:
最近修改專案的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;
;
大家還是要根據自己專案的具體情況進行判斷,不要意味的百度。