Oracle

觸發獲取下一個前綴 ID:有更好的方法嗎?

  • June 28, 2017

我有一張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;

引用自:https://dba.stackexchange.com/questions/177407