2017-09-04 53 views
0

正如我在標題中所描述的那樣,我想寫一個觸發器來定義添加一個新的人員,除了ID之外的所有屬性,我想要觸發生成並自動插入它。我怎樣才能做到這一點?如何定義插入新人時自動生成id的觸發器?

我已經在PL/SQL中編寫了如下所示的代碼,但它包含了序列,我無法找到如何使用序列獲取我的員工的當前最大ID,那麼請你幫助我,是否使用序列?

CREATE SEQUENCE BEFORE_INSERTING START WITH 1000 INCREMENT BY 1; 

CREATE OR REPLACE TRIGGER NEW_ID_BEFORE_INSERTING 
BEFORE INSERT ON STAFF 
FOR EACH ROW 
BEGIN 
:NEW.STAFF_ID := BEFORE_INSERTING.nextval; 
END; 
/

順便說一句,這個代碼工作正常,但是當你看到它是從1000

+0

使用序列有什麼問題? –

+0

我必須從當前最大ID繼續,但我從1000開始,而不是從當前最大值開始。 那麼是否有任何代碼可以獲得當前的最大值並通過加1來繼續計數?希望我的英語很清楚,對不起。 – CemAtes

+0

「*我如何獲得當前的最大ID *」 - 你不需要這個。無論如何,它在多用戶環境下無法正常工作。序列中的差距是**不相關**絕對沒有必要避免它們。 –

回答

2

開始也許你可以使用類似下面找到STAFF_ID的最大值,然後重新定義基於序列該值:

DECLARE 
    nMax_staff_id NUMBER; 
BEGIN 
    SELECT MAX(STAFF_ID) 
    INTO nMax_staff_id 
    FROM STAFF; 

    EXECUTE IMMEDIATE 'DROP SEQUENCE BEFORE_INSERTING'; 

    EXECUTE IMMEDIATE 'CREATE SEQUENCE BEFORE_INSERTING START WITH ' || 
        nMax_staff_id + 1 || ' INCREMENT BY 1'; 
END; 

您只需要運行一次以上,只是爲了獲得序列重置。之後,觸發器將使用該序列來獲取每個STAFF_ID值。請注意,還有其他方法可以重新定義序列的值,但在此我們將執行可能可能工作的最簡單事情,即刪除序列,然後使用新的初始值重新創建序列。

祝你好運。

1

,以便找到最大STAFF_ID你需要以下選擇:

select max(STAFF_ID) from STAFF; 

一旦你有,你可以最高STAFF_ID根據需要重新創建序列。

在任何情況下,你可以增加一個序列,像這樣:

ALTER SEQUENCE seq_name INCREMENT BY 1; 

我希望幫助!

請不要猶豫,留下任何進一步的澄清評論。

泰德。

1

使用序列保證STAFF_ID的唯一性,但不保證在分配STAFF_ID時沒有間隙。您最終可能會得到STAFF_ID,例如100,101,103,106 ..

首先,在系統未運行時獲取最大值(STAFF_ID)。類似於

select max(staff_id) from staff; 

然後,創建從最大staff_id開始的序列。喜歡的東西

create sequence staff_sequence start with <max_id> + 1 increment by 1 nocache; 

「NOCACHE」有差距的分配

後staff_id的機會,使用創建從seuqnece得到NEXTVAL

注意以下觸發最小化: - 爲nextval調用一個序列後,該調度的數字將不能返回到序號 - 如果oracle數據庫已關閉,則任何緩存的序列值都將丟失

如果您的要求不是在staff_ids之間存在差距,則可能不會使用序列。