2014-10-31 22 views
0

我正在使用oracle 11gr2,並且在插入新產品時用於產品表我需要指定從1到65535的自動增量編號。然後可以刪除產品。 當我到達65535時,我需要掃描表格以找到一個空洞來指定新的ID。 因爲我有這個需求oracle序列無法使用,所以我正在使用一個函數(也試圖插入一個觸發器),以便生成一個空閒的ID ... 問題是,我無法處理批處理插入例如我有併發問題... 我怎麼能解決這個問題?通過使用某種外部Id生成器?間隔內的Oracle序列發生器

+0

請發表一個例子。 – 2014-10-31 06:37:37

+5

您確定要**重用產品ID **嗎?從業務流程的角度來看,這幾乎總是不是一個好主意 – 2014-10-31 06:38:27

回答

0

聽起來像任意設計。有16位最大產品ID或重用ID的充分理由嗎?兩種限制都是不好的做法。

我懷疑任何外部生成器將提供Oracle尚未提供的任何內容。我建議使用批次插入序列。您遇到的問題是如何回收這些ID。 Oracle普通序列不會跟蹤主鍵,因此您需要一個解決方案來首先查找循環密鑰,然後回退到序列。

產品ID回收

  1. 批量插入 - 首次加載它們使用的密鑰序列。對於這個小範圍,在序列上設置NOCACHE以消除間隙。
  2. 刪除 - 刪除產品時,不是實際刪除行,而是在該行上設置DELETED ='Y'標誌。
  3. 插入 - 更新可用DELETED標誌設置的第一條記錄,或者從產品表中選擇DELETED ='Y'的最小ID。更新與新產品的信息(但相同的ID)和集中刪除=「N」

這可以確保您插入新的序列編號

如果要實現在數據庫中的邏輯之前,你總是回收記錄,您可以創建一個視圖(VIEW $ PRODUCTS),其中DELETED ='N'和一個INSTEAD OF INSERT觸發器來執行插入操作。

在任何情況下,當您用完序列(或序列包裝)時,對於批量插入而言運氣不佳。如果我是你,我會重新考慮設計的這一部分。

+0

謝謝您的評論。 productID不是真正的主鍵:原因是我必須爲1-65535範圍內的每個人分配一個業務ID(出於商業原因)(然後,我將二進制文件中的此產品目錄傳輸到無法處理的AVM高達16位最大產品ID)...目前我已經使用軟刪除,因爲我需要跟蹤歷史記錄,經過一段時間,我做了一個真正的刪除...所以我無法使用您的解決方案。我想我需要有1到6535個有效的唯一產品ID。並且可能有相同標識的產品被標記爲已停用... – Dypso 2014-10-31 10:39:56

+0

1至6535 - 這是一個錯字嗎? – codenheim 2014-10-31 14:41:11

+0

是的!那是在1到65535之間 – Dypso 2014-10-31 14:47:32