Oracle與Mysql操作表序列


一、Oracle添加表序列

CREATE SEQUENCE name -- 序列名

INCREMENT BY -- 每次加幾個
START WITH -- 從幾開始計數
MINVALUE --- 最小值
MAXVALUE --- 最大值
NOCACHE --- 沒有緩存
CACHE --- 緩存 默認為20,最少為2個
NOCYCLE --- 一直累加,不循環

例如:

drop  SEQUENCE FILE_SEQ;
CREATE SEQUENCE FILE_SEQ
INCREMENT BY 1   
START WITH 1     
MINVALUE 1
MAXVALUE 99999999999999
NOCYCLE  
CACHE 2;

生成后如圖:

獲取當前序列

select 序列名.currval from dual;  //獲取序列的當前值,這個值是可變的。

需要注意的是:        

數據庫連接成功后,初次執行這句話,會報異常,不能用。

如果不是你的語句單詞拼寫錯誤,就是因為沒有先執行下邊這句sql,

獲取下一個序列

select 序列名.nextval from dual 

二、MySql添加表序列

第一步:創建Sequence管理表 sequence

DROP TABLE IF EXISTS sequence; 
CREATE TABLE sequence ( 
name VARCHAR(50) NOT NULL, 
current_value INT NOT NULL, 
increment INT NOT NULL DEFAULT 1, 
PRIMARY KEY (name) 
) ENGINE=InnoDB;

第二步:創建取當前值的函數 currval

DROP FUNCTION IF EXISTS currval; 
DELIMITER $ 
CREATE FUNCTION currval (seq_name VARCHAR(50)) 
RETURNS INTEGER
LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT ''
BEGIN
DECLARE value INTEGER; 
SET value = 0; 
SELECT current_value INTO value 
FROM sequence
WHERE name = seq_name; 
RETURN value; 
END
$ 
DELIMITER ;

第三步:創建取下一個值的函數 nextval

DROP FUNCTION IF EXISTS nextval; 
DELIMITER $ 
CREATE FUNCTION nextval (seq_name VARCHAR(50)) 
RETURNS INTEGER
LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT ''
BEGIN
UPDATE sequence
SET current_value = current_value + increment 
WHERE name = seq_name; 
RETURN currval(seq_name); 
END
$ 
DELIMITER ;

第四步:創建更新當前值的函數 setval

DROP FUNCTION IF EXISTS setval; 
DELIMITER $ 
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER) 
RETURNS INTEGER
LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT ''
BEGIN
UPDATE sequence
SET current_value = value 
WHERE name = seq_name; 
RETURN currval(seq_name); 
END
$ 
DELIMITER ;

備注:以上sql中DELIMITER與后面的分號有一個空格或者執行會報錯 。

 

測試:

INSERT INTO sequence VALUES ('TestSeq', 0, 1);
----添加一個sequence名稱和初始值,以及自增幅度  添加一個名為TestSeq 的自增序列

SELECT SETVAL('TestSeq', 10);
---設置指定sequence的初始值    這里設置TestSeq 的初始值為10

SELECT CURRVAL('TestSeq');  
--查詢指定sequence的當前值   這里是獲取TestSeq當前值

SELECT NEXTVAL('TestSeq');  
--查詢指定sequence的下一個值  這里是獲取TestSeq下一個值

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM