在 mysql 上模擬序列以準備遷移到 oracle
我一直在開發針對 MySQL 的應用程序,而新的開發伺服器正在慢慢建立。新的開發伺服器將使用 oracle,因為我們已經接近它準備好了,我想從我的主鍵中刪除 auto_increment 屬性,並模擬 Oracle 的序列。我已經好幾年沒用過oracle了。
由於每個預插入觸發器都會做同樣的事情——從 foo_sequence 中獲取表foo的下一個 id ,Oracle 是否允許實現某種形式的動態/詞法觸發?
任何提示、技巧或陷阱?
編輯#1:1550 - 這不是一個重度使用的應用程序。一次使用將導致在最大事務中插入 13 次小而簡單的記錄。並發性是未知的,但一個使用者可能導致任何意義的鎖飢餓是估計非常低的 IMO。
編輯#2 1612:目的是在 mysql 中模擬 oracle 序列,然後在 oracle 上使用 oracle 序列。
謝謝。
解決:
我正在實現一個類來充當我對序列的介面。
- 在 mysql 上,我正在實現一個表來保存序列值,以及一個儲存過程來獲取下一個值並更新行。該類將呼叫此儲存過程並返回值。
- 在 oracle 上,我只會從 oracle 序列中獲取下一個值。班級會提出這個要求。Sequence 類將請求序列中的下一個值。
應用程式碼將使用 Sequence 類來獲取插入的下一個序列值,從使用該值的插入語句中抽像出“nextval”實現細節。
“陷阱”是,幾乎在所有情況下,您都不想僅僅為了隱藏 pk 插入而對觸發器造成性能和維護損失。
您確實應該編寫查詢以使用 INSERT 插入 sequence.nextval。在遷移過程中做到這一點,以免幾年後你後悔。
由於 MySQL 缺少序列對象,過去有一篇關於有人如何為 MySQL 應用程序 jerryrigged 序列範例的文章。
我在 2012 年 3 月 16 日回答了這個問題。
從兩個角度考慮
觀點#1
如果您有任何圍繞序列設計的特殊表,這些表將通過使用 Oracle 序列而過時,則無需遷移這些表。您的程式碼庫必須更改以使用從 Oracle 序列中呼叫 NEXTVAL 來替換更新序列表。
觀點 #2
如果您希望保留圍繞您控制的序列設計的特殊表,您的程式碼不需要更改,但 Oracle 將如何執行?恕我直言,使用 Oracle 序列就像使用 MyISAM 表:發出一個完整的鎖來遞增並返回一個值。您的方法比 Oracle 序列更好嗎?您將不得不對此進行基準測試。結果將決定您是保留程式碼庫還是替換所有排序程式碼。
結語
無論你決定什麼,你都必須忍受。我這樣說是因為您的排序程式碼在今天使用 Oracle 11g 時可能很棒,只是被 Oracle 的最新升級或數據庫上不斷增加的數據流量所超越。