zoukankan      html  css  js  c++  java
  • 在数据库中使用数字ID作为主键的表生成主键方法

        在数据库开发中,很多时候建一个表的时候会使用一个数字类型来作为主键,使用自增长类型自然会更方便,只是本人从来不喜欢有内容不在自己掌控之中,况且自增长类型在进行数据库复制时会比较麻烦。所以本人一直使用自己生成最大数字来保存主键。只是多任务同时写入数据库时,就偶尔会有主键冲突的情况出现了。因为得到最大数值时的查询语句如果同时进行就会出现相同的数字ID了。考虑到如果进行锁表的代价比较大,所以经过考虑,还是在一个表中保存最大ID这种速度快并且锁定的代价很小。本人使用SqlServer2008R2数据库,首先建立保存数字ID的表,如下所示,可以保存多个表的ID。字段分别代表表名、当前可用ID、ID对应字段名。

    CREATE TABLE [dbo].[TableKey](
    	[TableName] [varchar](50) NOT NULL,
    	[TableKeyID] [numeric](18, 0) NOT NULL,
    	[KeyFieldName] [varchar](50) NOT NULL,
     CONSTRAINT [PK_TableKey] PRIMARY KEY CLUSTERED 
    (
    	[TableName] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    

    建立表之后,使用一个存储过程来取回某个表当前可用的最大ID号,并把ID号增长后保存。

    CREATE PROCEDURE [dbo].[SP_GetNewID]
    	@TableName varchar(50)
    AS
    BEGIN
    
    	SET NOCOUNT ON;
    	
    	DECLARE @NextTKey BIGINT 
    	
    	BEGIN TRAN TransID 
    	
    	-- 得到最新ID,采用更新锁,并保持到事务完成 
    	SELECT @NextTKey = TableKeyID + 1 FROM TableKey WITH (UPDLOCK) WHERE TableName = @TableName 
    	IF @@ROWCOUNT = 0	
    	BEGIN
    		SET @NextTKey = 1
    		INSERT INTO TableKey (TableName, TableKeyID) VALUES (@TableName, @NextTKey)
    	END	
    	ELSE
    	BEGIN
    		-- 更新新的ID
    		UPDATE TableKey	SET TableKeyID = @NextTKey WHERE TableName = @TableName
    	END
    	
    	COMMIT TRAN TransID 
    	
        RETURN @NextTKey
    END
    
    GO
    

    使用这种方法后,得到最大ID应该就很少会出问题了。

  • 相关阅读:
    .Net自动生成Html新闻系统V1.0 Beta 下载
    Visual Studio .NET 2003中自己找到的一个小技巧[图]
    多表连接的SQL写法(SqlServer、Oracle)
    在线人数统计 V1.0(Asp.net+ SqlServer) 源码下载
    Visual Studio 2005安装后,原来的Asp.net1.1不能执行的解决方法。
    [函数]截取固定长的字符串(双字节的计2位)
    [原创]asp.net 2.0下的自定义树(myTreeView)
    通用的数据库操作助手类
    关于时间国际化的方案
    HTTPS Cipher Suite问题
  • 原文地址:https://www.cnblogs.com/lanma/p/6678057.html
Copyright © 2011-2022 走看看