记录:264
场景:在MySQL数据库中使用自定义函数实现序列。
功能:获取当前序列值、获取下一个序列值、设置序列值。
本例环境:MySQL 5.7.33
1.建表语句
CREATE TABLE `HUB_SEQUENCE` (
`SEQ_CODE` VARCHAR(64) NOT NULL COMMENT '序列代码',
`SEQ_NAME` varchar(256) DEFAULT NULL COMMENT '序列名称',
`CURRENT_VAL` BIGINT(16) NOT NULL COMMENT '当前序列值',
`INCREMENT_VAL` INT(8) NOT NULL DEFAULT '1' COMMENT '增长值',
PRIMARY KEY (`SEQ_CODE`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='序列表';
功能:用于存储序列的代码、名称、当前值、增长值。
2.获取当前序列值
函数名:CURRVAL
入参:V_SEQ_CODE 类型 VARCHAR (64)
返回:BIGINT类型数值
设计逻辑:在函数中从HUB_SEQUENCE表的CURRENT_VAL值返回,即当前序列值。
函数SQL:
DELIMITER $$
USE `hub_db` $$
DROP FUNCTION IF EXISTS `CURRVAL` $$
CREATE DEFINER = `hub_db` @`%` FUNCTION `CURRVAL` (V_SEQ_CODE VARCHAR (64))
RETURNS BIGINT (16)
DETERMINISTIC
BEGIN
DECLARE VALUE BIGINT;
SET VALUE = 0;
SELECT
CURRENT_VAL INTO VALUE
FROM
HUB_SEQUENCE
WHERE SEQ_CODE = V_SEQ_CODE;
RETURN VALUE;
END $$
3.获取下一个序列值
函数名:NEXTVAL
入参:V_SEQ_CODE 类型 VARCHAR (64)
返回:BIGINT类型数值
设计逻辑:在函数中从HUB_SEQUENCE表的CURRENT_VAL + INCREMENT_VAL求和的值返回,即获取下一个序列值。
函数SQL:
DELIMITER $$
USE `hub_db`$$
DROP FUNCTION IF EXISTS `NEXTVAL`$$
CREATE DEFINER=`hub_db`@`%` FUNCTION `NEXTVAL`(V_SEQ_CODE VARCHAR(64))
RETURNS BIGINT(16)
DETERMINISTIC
BEGIN
UPDATE HUB_SEQUENCE
SET CURRENT_VAL = CURRENT_VAL + INCREMENT_VAL
WHERE SEQ_CODE = V_SEQ_CODE;
RETURN currval(V_SEQ_CODE);
END$$
4.设置序列值
函数名:SETVAL
入参:V_SEQ_CODE 类型 VARCHAR (64)
返回:BIGINT类型数值
设计逻辑:在函数中更新HUB_SEQUENCE表的CURRENT_VAL值,即设置序列值。
函数SQL:
DELIMITER $$
USE `hub_db`$$
DROP FUNCTION IF EXISTS `SETVAL`$$
CREATE DEFINER=`hub_db`@`%` FUNCTION `SETVAL`(V_SEQ_CODE VARCHAR(64), VALUE BIGINT)
RETURNS BIGINT(16)
DETERMINISTIC
BEGIN
UPDATE HUB_SEQUENCE
SET CURRENT_VAL = VALUE
WHERE SEQ_CODE = V_SEQ_CODE;
RETURN CURRVAL(V_SEQ_CODE);
END$$
5.报错处理
错误信息:
The user specified as a definer ('hub_db'@'%') does not exist
解决方式:
5.1登入MySQL后台
命令:mysql -u root -p 密码
5.2赋权
命令:
grant all privileges on *.* to hub_db@"%" identified by "密码";
flush privileges;
5.3注意
注意本例数据库名称:hub_db,在SQL中对应位置替换掉即可。
6.体验
6.1初始化数据
INSERT INTO HUB_SEQUENCE
(SEQ_CODE,SEQ_NAME,CURRENT_VAL,INCREMENT_VAL)
VALUE
('SEQ_SYSTEM_LOG','系统日志',1,1);
6.2使用SQL
SELECT CURRVAL('SEQ_SYSTEM_LOG') FROM DUAL;
SELECT NEXTVAL('SEQ_SYSTEM_LOG') FROM DUAL;
SELECT SETVAL('SEQ_SYSTEM_LOG',20211215) FROM DUAL;
6.3函数列表截图
以上,感谢。
2021年12月16日