MySql中序列的應用和總結

Mysql中的序列主要用於主鍵,主鍵是遞增的字段,不可重複。

Mysql與Oracle不同的是,它不支持原生態的sequence,需要用表和函數的組合來實現類似序列的功能。

1.首先創建序列的主表

/*
 Navicat Premium Data Transfer

 Source Server         : MySql_192.168.10.7
 Source Server Type    : MySQL
 Source Server Version : 100113
 Source Host           : 192.168.10.7:3306
 Source Schema         : config_fao_atp

 Target Server Type    : MySQL
 Target Server Version : 100113
 File Encoding         : 65001

 Date: 17/04/2020 17:38:44
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sequence
-- ----------------------------
DROP TABLE IF EXISTS `sequence`;
CREATE TABLE `sequence`  (
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `current_value` int(11) NOT NULL,
  `increment` int(11) NOT NULL DEFAULT 1,
  PRIMARY KEY (`name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of sequence
-- ----------------------------
INSERT INTO `sequence` VALUES ('artableSeq', 10021776, 1);

SET FOREIGN_KEY_CHECKS = 1;

其次創建如下三個函數,它們的功能分別是:查詢當前序列值、查詢下一個序列值、設置序列的起始值。

/*
 Navicat Premium Data Transfer

 Source Server         : MySql_192.168.10.7
 Source Server Type    : MySQL
 Source Server Version : 100113
 Source Host           : 192.168.10.7:3306
 Source Schema         : config_fao_atp

 Target Server Type    : MySQL
 Target Server Version : 100113
 File Encoding         : 65001

 Date: 17/04/2020 17:38:44
*/
-- ----------------------------
-- Function structure for currval
-- ----------------------------
DROP FUNCTION IF EXISTS `currval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `currval`(seq_name VARCHAR(50)) RETURNS int(11)
    DETERMINISTIC
BEGIN
DECLARE value INTEGER; 
SET value = 0; 
SELECT current_value INTO value 
FROM sequence
WHERE name = seq_name; 
RETURN value; 
END
;;
DELIMITER ;

-- ----------------------------
-- Function structure for nextval
-- ----------------------------
DROP FUNCTION IF EXISTS `nextval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `nextval`(seq_name VARCHAR(50)) RETURNS int(11)
    DETERMINISTIC
BEGIN
UPDATE sequence
SET current_value = current_value + increment 
WHERE name = seq_name; 
RETURN currval(seq_name); 
END
;;
DELIMITER ;

-- ----------------------------
-- Function structure for setval
-- ----------------------------
DROP FUNCTION IF EXISTS `setval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `setval`(seq_name VARCHAR(50), value INTEGER) RETURNS int(11)
    DETERMINISTIC
BEGIN
UPDATE sequence
SET current_value = value 
WHERE name = seq_name; 
RETURN currval(seq_name); 
END
;;
DELIMITER ;

3.最後初始化序列數據,測試序列功能。

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

---設置指定sequence的初始值    這裏設置filegenSeq 的初始值爲10
SELECT SETVAL('filegenSeq', 10000000);

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

--查詢指定sequence的下一個值  這裏是獲取filegenSeq下一個值
SELECT NEXTVAL('filegenSeq');  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章