弃用数据库自增ID,曝光一下我自己用到的解决方法 (转发)

简介: 在平时的项目开发中,我相信有很大一批人都在用这个数据库自增ID,用数据库自增ID有利也有弊。     优点:节省时间,根本不用考虑怎么来标识唯一记录,写程序也简单了,数据库帮我们维护着这一批ID号。
在平时的项目开发中,我相信有很大一批人都在用这个数据库自增ID,用数据库自增ID有利也有弊。

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

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

  

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

  解决思路:

    

1:定义一张表,专门用来存放存所有需要唯一ID的表名称以及该表当前所使用到的ID值。
2: 写一个存储过程,专门用来在上一步的表中取ID值。

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

 

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
第一步:创建表
create   table  table_key
(
       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

 

 

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

    

 

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

    优点:

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

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

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

    缺点:

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

    2:并发问题。

    很多人有提到!不过凡事都是一把双刃剑,这就好比做优化,要么以时间换空间,要么以空间换时间,这个世界上根本不存十全十美的事物!

      个人拙见!仅此而已!

    

 

转发自: http://www.cnblogs.com/repository/archive/2011/01/17/1937265.html
目录
相关文章
|
2月前
|
SQL 关系型数据库 数据处理
实时计算 Flink版产品使用问题之如何去除源数据库的ID
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2月前
|
前端开发 数据库
文本----富文本数据如何存入到数据库当中,解决方法,看其他大佬写的文章
文本----富文本数据如何存入到数据库当中,解决方法,看其他大佬写的文章
文本----富文本数据如何存入到数据库当中,解决方法,看其他大佬写的文章
|
2月前
|
存储 小程序 数据库
【微信小程序-原生开发】实用教程08 - 开通微信云开发,操作云数据库新增数据(含修改数据权限),初始化云服务(含获取微信云环境 id),获取云数据,滚动公告栏
【微信小程序-原生开发】实用教程08 - 开通微信云开发,操作云数据库新增数据(含修改数据权限),初始化云服务(含获取微信云环境 id),获取云数据,滚动公告栏
45 0
|
4月前
|
Oracle 关系型数据库 数据库
Oracle数据库协议适配器错误解决方法
Oracle数据库协议适配器错误解决方法
401 2
|
12月前
|
关系型数据库 MySQL 数据库连接
win10关于mysql5.7数据库连接不上的解决方法
win10关于mysql5.7数据库连接不上的解决方法
147 0
|
4月前
|
SQL 关系型数据库 MySQL
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
30 0
|
9月前
|
设计模式 算法 Java
浩鲸科技:为什么要用雪花ID替代数据库自增ID?
浩鲸科技:为什么要用雪花ID替代数据库自增ID?
82 1
|
4月前
|
SQL 数据库
数据库Sql题目 : 不用id,每隔10行取一条数据
数据库Sql题目 : 不用id,每隔10行取一条数据
|
关系型数据库 Java MySQL
Java 最常见的面试题:一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
Java 最常见的面试题:一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
|
12月前
|
关系型数据库 MySQL 数据库
MySQL数据库表Id过大
MySQL数据库表Id过大
117 0