我正在使用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. 序列發生器
- 4. 在給定時間間隔內事件發生的次數
- 5. camunda的序列發生器
- 6. 自動生成Oracle中所有表的序列和觸發器
- 7. 隨機的Cplex數發生器用一定的時間間隔
- 8. Oracle休眠序列生成器問題
- 9. Oracle間隔錯誤?
- 10. 線性序列發生器
- 11. perl序列號發生器
- 12. R生成1分鐘的時間間隔序列
- 13. Oracle時間間隔桶
- 14. Oracle - 間隔時間戳
- 15. 在正確的時間間隔內未觸發Qml計時器
- 16. 創建Oracle序列觸發器
- 17. $發生太多次的間隔
- 18. 執行觸發器的時間間隔
- 19. Oracle序列沒有生成
- 20. NodaTime間隔JSON序列化
- 21. shell排序最快的間隔序列?
- 22. 如何將時間範圍/時間間隔分爲多個分箱間隔發生的時間間隔
- 23. 的Java序列發生器服務
- 24. 並行化發生器的序列
- 25. Informix「序列化」Oracle數據庫/序列/觸發器Pro * C
- 26. 用於從序列中生成id的Oracle觸發器的HIbernate問題
- 27. Oracle觸發序列和lpad
- 28. oracle序列和併發性
- 29. SQL觸發器列表Oracle
- 30. 查詢發現,發生的時間間隔內的地方開始時間是從
請發表一個例子。 – 2014-10-31 06:37:37
您確定要**重用產品ID **嗎?從業務流程的角度來看,這幾乎總是不是一個好主意 – 2014-10-31 06:38:27