環境:
- window 10
- sqlserver 2014
概述:
數據庫的id有很多種方法:
- 自增ID
- 序列(sqlserver 2008 r2中沒有)
- 分佈式id(雪花算法)
- 基於程序內緩存
- 基於redis緩存
- 基於數據庫存儲過程
這裏展示基於數據庫存儲過程生成id,它有如下好處:
- 將id和表徹底分離,即使表或字段不存在也不影響生成。它就相當於,你只要提供兩個關鍵字,就可以拿到id了
- 可以在插入表之前知道id的具體值(除了自增id都有這個優點)
- 相比於程序內緩存,不用考慮由於多個程序訪問數據庫造成緩存不一致的問題
它有如下缺點:
- 每次生成id都要訪問數據庫,開銷增大
- 由於唯一id生成依賴數據庫,所以在分佈式環境中注意id的唯一值是否滿足條件
代碼:
-- 先創建存儲id的表
create table __generator_id(
tablename varchar(50),
colname varchar(50),
currentid bigint
);
-- 創建生成id的存儲過程
create proc __proc_generateid
@tablename varchar(50),
@colname varchar(50)
as
declare @current bigint
set @current=(select currentid from __generator_id where tablename=@tablename and colname=@colname)
if @current is null
begin
insert into __generator_id(tablename,colname,currentid) values(@tablename,@colname,1)
select 1
end
else
begin
set @current+=1
update __generator_id set currentid=@current where tablename=@tablename and colname=@colname
select @current
end
測試調用:
exec __proc_generateid "xiaoming","id3"
exec __proc_generateid "xiaoming","id3"
效果如下:
此時,表__generator_id的值爲: