標籤:style http io ar color 使用 sp on 資料
-
MySQL實作類別似Oracle的序列
-
2013-10-22 10:33:35 我來說兩句 走過的足跡
-
收藏 我要投稿
-
MySQL實作類別似Oracle的序列 Oracle一般使用序列(Sequence)來處理主鍵欄位,而MySQL則提供了自增長(increment)來實作類別似的目的;但在實際使用過程中發現,MySQL的自增長有諸多的弊端:不能控制步長、開始索引、是否迴圈等;若需要遷移資料庫,則對於主鍵這塊,也是個頭大的問題。本文記錄了一個類比Oracle序列的方案,重點是想法,代碼其次。Oracle序列的使用,無非是使用.nextval和.currval偽列,基本想法是:1、MySQL中建立表,用於儲存序列名稱和值;2、建立函數,用於擷取序列表中的值;具體如下:表結構為 [sql] 表結構為: ?
| 1234567 |
drop table if exists sequence; create table sequence ( seq_name VARCHAR(50) NOT NULL, -- 序列名稱 current_val INT NOT NULL, --當前值 increment_val INT NOT NULL DEFAULT 1, --步長(跨度) PRIMARY KEY (seq_name) ); |
實現currval的類比方案 ?
| 1234567891011 |
[sql] create function currval(v_seq_name VARCHAR(50)) returns integer begin declare value integer; set value = 0; select current_value into value from sequence where seq_name = v_seq_name; return value; end; |
[sql] 函數使用為:select currval(‘MovieSeq‘); 實現nextval的類比方案?
| 123456789 |
[sql] create function nextval (v_seq_name VARCHAR(50)) return integer begin update sequence set current_val = current_val + increment_val where seq_name = v_seq_name; return currval(v_seq_name); end; |
[sql] 函數使用為:select nextval(‘MovieSeq‘); 增加設定值的函數 ?
| 12345678 |
[sql] create function setval(v_seq_name VARCHAR(50), v_new_val INTEGER) returns integer begin update sequence set current_val = v_new_val where seq_name = v_seq_name; return currval(seq_name); |
同理,可以增加對步長操作的函數,在此不再敘述。
MySQL實作類別似Oracle的序列