阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL实现sequence功能的代码

177次阅读
没有评论

共计 1741 个字符,预计需要花费 5 分钟才能阅读完成。

使用函数创建自增序列管理表 (批量使用自增表,设置初始值,自增幅度)

第一步:创建 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;

测试函数功能

当上述四步完成后,可以用以下数据设置需要创建的 sequence 名称以及设置初始值和获取当前值和下一个值。

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 下一个值

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 下一个值

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计1741字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中