mysql 获取序列当前值,MySQL获取自增序列

因为业务要求,需要在MySQL数据库中,获取下一个自增主键的值。

原先采用的方法是:

select AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = '数据库名称' AND TABLE_NAME = '表名称' limit 1

但是这样写的话,在8.0以后的版本是取不到值的,必须在每一次需要获取自增序列之前,多执行一条表分析的语句。然后语句就会变成下面这样:

ANALYZE TABLE 表名;

select auto_increment FROM information_schema.tables

WHERE TABLE_SCHEMA = '库名' AND TABLE_NAME = '表名' limit 1;

这样写会造成一个问题,当表中的数据较多的时候,会造成查询的速度变慢。

因此,就要使用另外一个策略,就是自己创建一个自增序列。

由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能。

1.创建sequence表

CREATE TABLE `sequence` (

`name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '序列的名字',

`current_value` int(11) NOT NULL COMMENT '序列的当前值',

`increment` int(11) NOT NULL DEFAULT '1' COMMENT '序列的自增值',

PRIMARY KEY (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

2.创建–取当前值的函数

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 ;

3.创建–取下一个值的函数

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 ;

4.创建–更新当前值的函数

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 ;

5.使用及测试

INSERT INTO sequence VALUES ('testSeq', 0, 1);--添加一个sequence名称和初始值,以及自增幅度

SELECT SETVAL('testSeq', 10);--设置指定sequence的初始值

SELECT CURRVAL('testSeq');--查询指定sequence的当前值

SELECT NEXTVAL('testSeq');--查询指定sequence的下一个值

这里,testSeq可以认为是一个表名,我们可以通过insert语句插入指定表的第一个序列,然后使用NEXTVAL方法,不断更新这一列数据,来获取下一个序列的值。可以通过这张表,来实现N张表的自增序列的统一管理。

标签:自增,name,seq,sequence,SQL,value,MySQL,序列

来源: https://blog.csdn.net/sinat_32034679/article/details/100974542

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 8.0及以上版本并没有内置的序列函数,但可以通过自定义函数实现类似的功能。以下是一个简单的自定义函数实现序列的示例: 1. 创建自定义函数 ``` DELIMITER $$ CREATE FUNCTION seq_nextval(seq_name VARCHAR(50)) RETURNS BIGINT BEGIN DECLARE seq_val BIGINT DEFAULT 0; SET seq_val = (SELECT seq_val FROM sequence WHERE seq_name = seq_name FOR UPDATE); IF seq_val IS NULL THEN SET seq_val = 1; INSERT INTO sequence (seq_name, seq_val) VALUES (seq_name, seq_val); ELSE SET seq_val = seq_val + 1; UPDATE sequence SET seq_val = seq_val WHERE seq_name = seq_name; END IF; RETURN seq_val; END$$ DELIMITER ; ``` 上述代码中,我们创建了一个名为 seq_nextval 的自定义函数,它接受一个参数 seq_name,表示序列的名称。函数的作用是获取指定名称的序列的下一个。 函数首先从名为 sequence 的表中获取指定名称的序列当前,如果该序列不存在,则将其初始化为1,并返回1。如果序列存在,则将其加1,并更新 sequence 表中的,最后返回更新后的。 2. 创建序列表 在自定义函数中,我们用到了一个名为 sequence 的表,它用于存储所有序列当前。我们需要先创建该表: ``` CREATE TABLE sequence ( seq_name VARCHAR(50) PRIMARY KEY, seq_val BIGINT ); ``` 3. 使用自定义函数获取序列的下一个 现在我们可以使用 seq_nextval 函数获取指定名称的序列的下一个了: ``` SELECT seq_nextval('my_seq'); ``` 上述代码中,我们调用 seq_nextval 函数,并传入名称为 my_seq 的序列。函数会返回该序列的下一个。 需要注意的是,由于自定义函数中用到了事务和行级锁,因此在高并发场景下可能会出现性能问题。如果需要生成大量的序列,建议使用自增主键或其他更高效的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值