mysql 生成id函式 MySQL ID生成策略

2021-10-17 17:45:46 字數 2553 閱讀 4474

簡介

隨著微服務框架的逐步應用,分布式id生成策略要支援高併發、有序性、易讀性。常用方案有uuid、guid、redis、mongodb等,本次只提供資料庫生成方式。作為平台框架基於適配原則提供資料庫層面的選擇,以下為具體的設計。

可適用於id持續增長,固定編碼長度,不足補零。

可適用於每天、每月、每年階段性的清零自增長。

可指定編碼的字首、字尾。

階段性的清零操作無需定時任務。

建立表結構

create table `tb_ids` (

`id` int(11) default null comment '編碼',

`object` varchar(100) default null comment '物件',

`segment` varchar(100) default null comment '切分段落',

`prefix` varchar(10) default null comment '字首',

`format` varchar(50) default null comment '段落格式',

`length` int(11) default null comment '數字長度',

`sequence` int(11) default null comment '當前序列',

`suffix` varchar(10) default null comment '字尾',

`type` int(11) default null comment '型別[1:持續累計;2:階段性累計]'

) engine=innodb default charset=utf8;

初始化資料

指定字首,按日重新累計;

指定字首,從1開始一直累加;

指定字首,按年月重新累計;

指定字首,按兩位年份重新累計;

insert into `tb_ids` values ('1', 'order', '20180629', 'r', '%y%m%d', '6', '0', '', '2');

insert into `tb_ids` values ('2', 'user', null, 'u', '', '6', '0', '', '1');

insert into `tb_ids` values ('3', 'sale', '201806', 'so', '%y%m', '6', '0', '', '2');

insert into `tb_ids` values ('5', 'year', '18', 'y', '%y', '6', '0', '', '2');

建立函式

create function `sequnce`(in_object varchar(50)) returns varchar(200) charset utf8

begin

#定義下個編碼變數

declare next varchar (100);

#定義是否同段內的編碼,如果不是從1開始。

declare is_same_segment tinyint (1);

#如果是連續遞增的編碼,設定為是同一段的編碼

select

(t.type = 1 ) into is_same_segment

from

tb_ids t

where

t.object = in_object ;

#如果不是連續遞增的編碼,查詢現在時間和上次編碼生成時間是否同乙個段落

if (!is_same_segment) then

select

t.segment = date_format(now(), t.format) into is_same_segment

from

tb_ids t

where

t.object = in_object ;

end if;

#更新編碼,如果統一段落加一,否則從一開始;更新此次編碼生成的段落;

update tb_ids t

set t.sequence = (

case

when !is_same_segment then # 不同段落從1開始

else # 相同段落累計

sequence + 1

endt.segment = date_format(now(), t.format)

where

object = in_object ;

# 根據字首、段落、序號,字尾生成編碼

select

concat(

ifnull(t.prefix,''),#字首

ifnull(date_format(now(), t.format),''),#段落

lpad(sequence, t.length, 0),#序列

ifnull(t.suffix,'')#字尾

) into next

from

tb_ids t

where

t.object = in_object ;

return next;

end測試

image.png

mysql生成隨機id

mysql中生成隨機id的函式是uuid 但是這樣生成出來的隨機id是36位帶 符號的。select uuid 37747019 90a2 11e9 9806 00505683703f 我們可以配合replace 函式替換掉 符號來生成32位的不帶 符號的隨機id。select replace uu...

MySql唯一ID生成

前陣子,一直在折騰阿里雲。寫的一些文章也放到自己的wordpress部落格上了。但自己前陣子在做系統更換操作的時候未備份磁碟,大部分心血付諸東流。真是乙個悲傷的故事。現在決定用.net搞搞自己的部落格。正好把wordpress給拋棄掉。言歸正傳,這個唯一號類似自增id,自增id雖然好用,但進行資料庫...

es手動生成id和自動生成id

1.es手動指定document id 1.根據應用情況來說,是否滿足手動指定document id的前提 一般來說,是從某些其他的系統中,匯入一些資料到es時,會採取這種方式。就是使用系統中已有的資料的唯一標識,作為es中 document的id.舉個例子,比如說,開發乙個電商 做搜尋功能,或者o...