Oracle
觸發獲取下一個前綴 ID:有更好的方法嗎?
我有一張
projects
桌子:+------------+-----+ | PROJECT_ID | ... | +------------+-----+ | LC000001 | | | LC000002 | | | LC000003 | | | LC000004 | | | LC000005 | | +------------+-----+
如您所見,該
PROJECT_ID
列具有文本數據類型 (NVARCHAR2
) 並且具有前綴 (LC
)。我猜想創建一個帶有前綴的 ID 可能是一個糟糕的設計選擇。但是,無論對錯,這就是我的組織建立業務的方式。
我編寫了一個觸發器,當在應用程序的屬性編輯環境
PROJECT_ID
中創建新行時,它會自動插入下一個(更多資訊請點擊此處)。CREATE OR REPLACE TRIGGER "PROJECTS_PROJECT_ID_TRIG" BEFORE INSERT ON PROJECTS FOR EACH ROW BEGIN SELECT 'LC' || LPAD(TO_CHAR(CAST(SUBSTR(MAX(PROJECT_ID),-6) AS NUMBER(15,0)) + 1),6, '0') INTO :NEW.PROJECT_ID FROM PROJECTS; END;
然而,這實際上是我寫過的第一個觸發器。它解構文本 ID,獲取下一個數字,然後重建文本 ID,這對我來說似乎過於復雜。我不禁認為甲骨文可能有更複雜的方法來處理這個問題。
有沒有更好的辦法?
我在這裡有一個後續的相關問題:Oracle IDENTITY 列可以為空嗎?
我希望您的觸發器會引發執行時“變異表”錯誤。除非使用自治事務,因為您無法查詢在其主體內觸發行級觸發器的表。
我寧願保持簡單 - 創建一個序列,例如
CREATE SEQUENCE SEQ_PROJECT START WITH 6 INCREMENT BY 1
. 此外,我只會在 project_id 未設置 (WHEN
子句) 時觸發觸發器。CREATE OR REPLACE TRIGGER "PROJECTS_PROJECT_ID_TRIG" BEFORE INSERT ON PROJECTS FOR EACH ROW -- Fire trigger only if statement doesn't set project_id WHEN (NEW.PROJECT_ID IS NULL) BEGIN :NEW.PROJECT_ID := 'LC' ||to_char(SEQ_PROJECT.NEXTVAL,'FM000000'); <- Fill Mode END;