MySQL獲取自增序列

2021-09-27 05:57:44 字數 2711 閱讀 8242

因為業務要求,需要在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 中建立自增的序列(sequence)

由於mysql和oracle不太一樣,不支援直接的sequence,所以需要建立一張table來模擬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;

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 ;

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 ;

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 ;

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張表的自增序列的統一管理。

獲取自增主鍵id

最近在看隊友的 發現個問題,後覺是自己out了。在做關聯表插入操作時,需要根據主表的 主鍵id作詳情表的屬性值,最笨的方法就是,先插入主表,然後通過查詢返回剛剛插入的 主鍵id,繼續 新增詳情表資料。下面介紹一下我從隊友 中get的新技能 方案 在mybatis的配置檔案中,有個叫keyproper...

Hibernate jpa獲取自增主鍵Id

專案中使用spring hibernate jpa。有場景需要儲存實體後獲取實體的主鍵進行下一步的操作。經過查詢資料以及參考通過修改主鍵註解的方式。即 documentid id generatedvalue strategy generationtype.identity private long...

Ejb3 0 獲取自增主鍵

相信很多朋友都跟我一樣對ejb3獲取自增id有困惑,我自己也煩惱了很久。網路上很多人都說 public integer add object p 這種方法可以獲取到自增的id 我嘗試過這種方法獲取自增的id,但是我獲取的id與資料庫序列自增的id不同 最後谷歌了一下,發現只要把觸發器定義在實體bea...