浅谈如何屏蔽数据库中自增ID功能
创始人
2024-07-20 07:30:37
0

在平时的项目开发中,我相信有很大一批人都在用这个数据库自增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 

第二步:创建存储过程来取自增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.  
  29.     --commit tran  
  30.     commit tran  
  31.         if @@error>0  
  32.       rollback tran  
  33. end 

对于在表中不存在记录,直接返回一个默认值为1的键值,同时插入该条记录到table_key表中。而对于已存在的记录,key值直接在原来的key基础上加1.

总结一下,这种方法非常简单,我说一下它的优缺点。

优点:

1:ID值是可控的。用户可以从指定段开始分配ID值,这对于在分布式数据要求同数据同步时,非常方便,很好地解决了ID重复的问题。

2:在编写程序中,ID值是可见的,比如在再插入关联的记录时,相比使用数据库自增ID的情况下,这种方法不需要在插入一条数据库记录之后,再去得到自增ID值,然再再使用该ID的值来插入关联的记录。我们可以一次性使用事务来插入关联记录。

3:对于需要批量插入数据时,我们可以改写一下上面的存储过程,返回一个段的开始ID,然后更新表时需要注意,不是原来的简单的递增1,而是递增你想要的插入多少条记录的总数。

缺点:

1:效率问题,每次取ID值都需要调用存储过程从数据库中检索一次。对于这种情况,我觉得效率不是很大问题,因为SQL server 会对我们经常调用的存储过程有缓存,再一点,这个表的数据应该不会很大,最多上千条(一个项目中上千个表的情况应该不是很多吧)。所以检索不是什么问题,何况是根据表名来检索(表名列已是主键)。

原文链接:http://www.cnblogs.com/repository/archive/2011/01/17/1937265.html

【编辑推荐】

  1. SQL Server 2000删除实战演习
  2. SQL Server存储过程的命名标准如何进行?
  3. 卸载SQL Server 2005组件的正确顺序
  4. 对SQL Server字符串数据类型的具体描述
  5. SQL Server数据类型的种类与应用
     

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...