因為業務要求,需要在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...