MySql唯一ID生成

2021-06-27 17:27:08 字數 2741 閱讀 8229

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

言歸正傳,這個唯一號類似自增id,自增id雖然好用,但進行資料庫切換(sql換mysql等等)的時候,參與具體業務邏輯的這個東西說不定就是乙個定時炸彈。但如果我們自己人為規定乙個唯一id,來代替系統的自增id呢?有以下的要求,任何情況下產生的id不重複;跟自增id類似,逐個增加。

我拿mariadb做的實驗。這個跟mysql語法一樣。centos 7以後只有他了。將就一下吧。

該錶乙個欄位存表名,乙個欄位存最大id

首先建表sql

-- 欄位comment 後面沒等號。。。

-- default 不加括號

-- 不特殊標明,status欄位意思為 0:正常;1:刪除

-- mysql約束,名字在前,列在括號內

create table `num`(

id int auto_increment not null

,name varchar(100) not null comment '表名'

,num bigint not null default 0 comment '該錶對應的編號'

,status int default 0 not null

,primary key `p_id`(`id`)

,unique key `u_name`(`name`)

)engine=innodb default charset=utf8 comment='編號表';

-- truncate table num;

drop procedure if exists proc_getnum;

-- 獲得編號的儲存過程

-- 返回值先需要set,然後select它

-- 引數的名字不要與表名、列名等一樣。會查不到值。

create procedure proc_getnum(in name varchar(100),out n bigint) comment '獲取編號'

begin

declare value bigint default (select exists (select num from num where name=name));

set @m=0;

if value<>1 then

begin

insert into num(name,num,status)values(name,(select @m:=1),0);

end;

else

begin

update num set num=@m:=num+1 where name=name;

set n=@m;

end;

select n;

end if;

end;

-- 呼叫儲存過程

call proc_getnum('user',@num);

然後執行。

直接呼叫儲存過程proc_getnum沒問題。但還要考慮到其他情況,多人操作的時候會產生一樣的id嗎。

===2014.12.24修正。name=name永遠為true。

drop procedure if exists duger.proc_getsysnum;

create procedure duger.`proc_getsysnum`(in m varchar(100),out n bigint)

comment '獲取編號'

begin

set @v:= (select exists (select num from sysnum where name=m));

set @m=0;

if @v<>1 then

insert into sysnum(name,num,status)values(m,(select @m:=1),0);

else

update sysnum set num=@m:=num+1 where name=m;

end if;

set n=@m;

select n;

end;

===end

我寫乙個控制台,開10個執行緒,每個執行緒執行100次。開三個控制台跑。這樣能模擬使用者的操作。如果這個儲存過程可以的話,最後會跑到3000。

private static string str = "server=.;database=duger;uid=root;pwd=pwd;port=3306;";// port首字母大寫

private static void main(string args)

;thread.start();

}console.readkey();

}private static void do()

}private static void do(string name)}}

ok,把控制台編譯一下。然後進入debug目錄,執行他。

看起來,有些理想。預想與實際的結果一樣。這個方法可以當唯一id試用。

歡迎推薦其它方法。共同討論。共同進步。

小廣告,個人**duger.net

php 生成唯一ID

function guid factor prefix suffix 生成因子 機器毫秒,使用者瀏覽器與作業系統資訊,使用者ip,隨機因子,及自定義 factor 因子 原理 自定義 factor 因子 例如可使用使用者 user id 模組標識 product,order.字首 prefix 可用...

php生成唯一id

網上查了下,有很多的方法 1 md5 time mt rand 1,1000000 這種方法有一定的概率會出現重複 2 php內建函式uniqid uniqid 函式基於以微秒計的當前時間,生成乙個唯一的 id.w3school參考手冊有一句話 由於基於系統時間,通過該函式生成的 id 不是最佳的。...

PHP生成唯一ID

php自帶乙個生成唯一id的方法uniqid 我們還可以傳入引數,這個引數作為生成的唯一id的字首,該方法生成的id是基於當前時間微秒數生成的id,保證了id的唯一性。示例 prefix itbsl 說明 string uniqud string prefix bool more entropy f...