前陣子,一直在折騰阿里雲。寫的一些文章也放到自己的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...