SQL server sequence构造自定义自增主键

sequence是SQL server 2012的新特性,不过仅支持int,bigint,smallint,tinyint型。可以实现数字的自增,以及在数据库级别中实现序列号在表,多列之间的共享。具体功能参考:https://www.cnblogs.com/CareySon/archive/2012/03/12/2391581.html

目前有个需求是插入数据,需要主键实现自增,并且主键是varchar类型。sequence不支持varchar

所以考虑用insert触发器构造自定义的主键,实现如下


首先在测试数据库下建测试表:

if exists (select * from sysobjects where name = 'testTable')
drop table testTable
create table testTable
(
	id varchar(10) primary key not null,
	val varchar(100),
	val2 varchar(100),
)
go

然后建sequence:

if exists (select * from sysobjects where name = 'sq_1')
drop sequence sq_1
create sequence sq_1
--sequence数据类型为bigint
as bigint
--最小值为1
minvalue 1
--最大值为99999
maxvalue 99999
--初始值为1
start with 1
--每次增加1
increment by 1
--不循环
no cycle
go

insert触发器:

if exists (select * from sysobjects where name = 'key_trigger')
drop trigger key_trigger
go
create trigger key_trigger
on testTable
for insert
as
declare @int_key bigint,@var_key varchar(10),@afterVal varchar(100),
@id varchar(100)
--接收sequence的值
set @int_key=(next value for sq_1)
select @id=id from inserted
--构造自定义主键
set @var_key='BV'+cast(@int_key as varchar)
--更新主键
update testTable set id=@var_key where id=@id
select @afterVal=val from testTable where id=@var_key

if(@afterVal=null)
begin
rollback transaction
print 'fail'
end
go

完成后执行测试代码:

insert into testTable(id,val,val2) values('1','test','test')

执行3次后,全查,结果如下,主键数字部分实现了自增

SQL server sequence构造自定义自增主键_第1张图片


还有其他更好方法,欢迎留言
PS:触发器实现只能对一个表进行操作,并且插入数据还是需要加一个“任意值”的主键,所以此逻辑还是放java里比较好

你可能感兴趣的:(SQL)