浅谈如何屏蔽数据库中自增ID功能

发表于:2011-1-19 10:42

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  在平时的项目开发中,我相信有很大一批人都在用这个数据库自增ID,用数据库自增ID有利也有弊。

  优点:节省时间,根本不用考虑怎么来标识唯一记录,写程序也简单了,数据库帮我们维护着这一批ID号。

  缺点:for example, 在做分布式数据库时,要求数据同步时,这种自增ID就会出现严重的问题,因为你无法用该ID来唯一标识记录。同时在数据库做移植时,也会出现各种问题,总之,对此自增ID有依赖的情况,都有可能出现问题。我绝对相信园子里有很一部分人都被这个“好用的东西” 曾经害惨过!

  我平时在开发项目的时候,一般都没有用到数据库的自增ID, 所以我想分享一下自己的解决方法。

  解决思路

  1:定义一张表,专门用来存放存所有需要唯一ID的表名称以及该表当前所使用到的ID值。

  2: 写一个存储过程,专门用来在上一步的表中取ID值。

  这个思路非常简单,我不作解释了,直接来看看我的实现方法:

  第一步:创建表

  1. create table table_key  
  2. (  
  3.  table_name   varchar(50) not null primary key,  
  4.        key_value    int         not null 
  5. )

  第二步:创建存储过程来取自增ID

  1. create procedure up_get_table_key  
  2. (  
  3.    @table_name     varchar(50),  
  4.    @key_value      int output 
  5. )  
  6. as 
  7. begin 
  8.      begin tran  
  9.          declare @key  int 
  10.            
  11.          --initialize the key with 1 
  12.          set @key=1  
  13.          --whether the specified table is exist 
  14.   if not exists(select table_name from table_key where table_name=@table_name)  
  15.             begin 
  16.     insert into table_key values(@table_name,@key)        --default key vlaue:1 
  17.             end 
  18.          -- step increase 
  19.          else      
  20.             begin 
  21. select @key=key_value from table_key with (nolock) where table_name=@table_name  
  22.                 set @key=@key+1  
  23.                 --update the key value by table name 
  24.           update table_key set key_value=@key where table_name=@table_name  
  25.             end 
  26.         --set ouput value 
  27.     set @key_value=@key 
  28.     --commit tran 
  29.     commit tran  
  30.         if @@error>0  
  31.       rollback tran  
  32. end

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号