我正在使用oracle 11gr2,並且在插入新產品時用於產品表我需要指定從1到65535的自動增量編號。然後可以刪除產品。 當我到達65535時,我需要掃描表格以找到一個空洞來指定新的ID。 因爲我有這個需求oracle序列無法使用,所以我正在使用一個函數(也試圖插入一個觸發器),以便生成一個空閒的ID ... 問題是,我無法處理批處理插入例如我有併發問題... 我怎麼能解決這個問題?通過使用某種外部Id生成器?間隔內的Oracle序列發生器
回答
聽起來像任意設計。有16位最大產品ID或重用ID的充分理由嗎?兩種限制都是不好的做法。
我懷疑任何外部生成器將提供Oracle尚未提供的任何內容。我建議使用批次插入序列。您遇到的問題是如何回收這些ID。 Oracle普通序列不會跟蹤主鍵,因此您需要一個解決方案來首先查找循環密鑰,然後回退到序列。
產品ID回收
- 批量插入 - 首次加載它們使用的密鑰序列。對於這個小範圍,在序列上設置NOCACHE以消除間隙。
- 刪除 - 刪除產品時,不是實際刪除行,而是在該行上設置DELETED ='Y'標誌。
- 插入 - 更新可用DELETED標誌設置的第一條記錄,或者從產品表中選擇DELETED ='Y'的最小ID。更新與新產品的信息(但相同的ID)和集中刪除=「N」
這可以確保您插入新的序列編號
如果要實現在數據庫中的邏輯之前,你總是回收記錄,您可以創建一個視圖(VIEW $ PRODUCTS),其中DELETED ='N'和一個INSTEAD OF INSERT觸發器來執行插入操作。
在任何情況下,當您用完序列(或序列包裝)時,對於批量插入而言運氣不佳。如果我是你,我會重新考慮設計的這一部分。
謝謝您的評論。 productID不是真正的主鍵:原因是我必須爲1-65535範圍內的每個人分配一個業務ID(出於商業原因)(然後,我將二進制文件中的此產品目錄傳輸到無法處理的AVM高達16位最大產品ID)...目前我已經使用軟刪除,因爲我需要跟蹤歷史記錄,經過一段時間,我做了一個真正的刪除...所以我無法使用您的解決方案。我想我需要有1到6535個有效的唯一產品ID。並且可能有相同標識的產品被標記爲已停用... – Dypso 2014-10-31 10:39:56
1至6535 - 這是一個錯字嗎? – codenheim 2014-10-31 14:41:11
是的!那是在1到65535之間 – Dypso 2014-10-31 14:47:32
- 1. Oracle分區間隔2列間隔
- 2. 自動生成Oracle中所有表的序列和觸發器
- 3. 隨機的Cplex數發生器用一定的時間間隔
- 4. Oracle休眠序列生成器問題
- 5. Oracle間隔錯誤?
- 6. R生成1分鐘的時間間隔序列
- 7. 線性序列發生器
- 8. perl序列號發生器
- 9. 創建Oracle序列觸發器
- 10. Oracle序列沒有生成
- 11. shell排序最快的間隔序列?
- 12. 如何將時間範圍/時間間隔分爲多個分箱間隔發生的時間間隔
- 13. 的Java序列發生器服務
- 14. Informix「序列化」Oracle數據庫/序列/觸發器Pro * C
- 15. 用於從序列中生成id的Oracle觸發器的HIbernate問題
- 16. oracle adf如何在2列之間進行間隔?
- 17. 針對Oracle 11g的Grails序列生成
- 18. 隨機間隔發生器對於設定的時間段內的實例數量
- 19. 以正確的時間間隔不發生事件c#定時器
- 20. 平均間隔10分鐘的大型不規則間隔時間序列產生24小時配置文件
- 21. Oracle - 將序列值設置爲觸發器內表格的最大縮進值
- 22. javascript非序列隨機數發生器
- 23. 如何創建序列號發生器?
- 24. 自然數字序列發生器
- 25. 從序列發生器開始
- 26. 序列發生器和用戶類型
- 27. 特殊序列號發生器
- 28. sql在間隔中發生的總時間
- 29. 按發生次數分組的時間間隔
- 30. 試圖在兩個限制之間生成等間隔的數字序列
請發表一個例子。 – 2014-10-31 06:37:37
您確定要**重用產品ID **嗎?從業務流程的角度來看,這幾乎總是不是一個好主意 – 2014-10-31 06:38:27