【IT168 技术】在平时的项目开发中,我相信有很大一批人都在用这个数据库自增ID,用数据库自增ID有利也有弊。
优点:节省时间,根本不用考虑怎么来标识唯一记录,写程序也简单了,数据库帮我们维护着这一批ID号。
缺点:for example, 在做分布式数据库时,要求数据同步时,这种自增ID就会出现严重的问题,因为你无法用该ID来唯一标识记录。同时在数据库做移植时,也会出现各种问题,总之,对此自增ID有依赖的情况,都有可能出现问题。我绝对相信园子里有很一部分人都被这个“好用的东西” 曾经害惨过!
我平时在开发项目的时候,一般都没有用到数据库的自增ID, 所以我想分享一下自己的解决方法。
解决思路
1:定义一张表,专门用来存放存所有需要唯一ID的表名称以及该表当前所使用到的ID值。
2: 写一个存储过程,专门用来在上一步的表中取ID值。
这个思路非常简单,我不作解释了,直接来看看我的实现方法:
create table table_key
(
table_name varchar(50) not null primary key,
key_value int not null
)
(
table_name varchar(50) not null primary key,
key_value int not null
)
第二步:创建存储过程来取自增ID
create procedure up_get_table_key
(
@table_name varchar(50), @key_value int output
)
as
begin
begin tran
declare @key int --initialize the key with 1
set @key=1 --whether the specified table is exist
if not exists(select table_name from table_key where table_name=@table_name) begin
insert into table_key values(@table_name,@key) --default key vlaue:1
end -- step increase else
begin
select @key=key_value from table_key with (nolock) where table_name=@table_name set @key=@key+1 --update the key value by table name
update table_key set key_value=@key where table_name=@table_name end --set ouput value
set @key_value=@key --commit tran commit tran
if @@error>0
rollback tran
end
(
@table_name varchar(50), @key_value int output
)
as
begin
begin tran
declare @key int --initialize the key with 1
set @key=1 --whether the specified table is exist
if not exists(select table_name from table_key where table_name=@table_name) begin
insert into table_key values(@table_name,@key) --default key vlaue:1
end -- step increase else
begin
select @key=key_value from table_key with (nolock) where table_name=@table_name set @key=@key+1 --update the key value by table name
update table_key set key_value=@key where table_name=@table_name end --set ouput value
set @key_value=@key --commit tran commit tran
if @@error>0
rollback tran
end