环境:
- 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的值为: