在数据库中使用数字ID作为主键的表生成主键方法
2017-04-07 14:46
489 查看
在数据库开发中,很多时候建一个表的时候会使用一个数字类型来作为主键,使用自增长类型自然会更方便,只是本人从来不喜欢有内容不在自己掌控之中,况且自增长类型在进行数据库复制时会比较麻烦。所以本人一直使用自己生成最大数字来保存主键。只是多任务同时写入数据库时,就偶尔会有主键冲突的情况出现了。因为得到最大数值时的查询语句如果同时进行就会出现相同的数字ID了。考虑到如果进行锁表的代价比较大,所以经过考虑,还是在一个表中保存最大ID这种速度快并且锁定的代价很小。本人使用SqlServer2008R2数据库,首先建立保存数字ID的表,如下所示,可以保存多个表的ID。字段分别代表表名、当前可用ID、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应该就很少会出问题了。
相关文章推荐
- java拼接字符,数据库字符和数字拼接的字符串作为字段,如ID,主键
- 使用有序GUID:提升其在各数据库中作为主键时的性能
- 数据库插入数据返回当前自增主键ID值的方法
- 【hibernate】主键生成策略使用UUID报出如下警告:org.hibernate.id.UUIDHexGenerator - HHH000409: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC 4122 compliant UUID values;
- php生成唯一数字id的方法汇总
- MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)
- 数据库测试工具dbmonster使用:int 型主键,外键,varchar型数据生成
- Nhibernate连接oracle数据库,主键ID用序列生成时连接数据库IO次数分析
- 如何使用php生成唯一ID的4种方法
- 数据库插入数据返回当前主键ID值方法
- php生成唯一数字id的方法汇总
- MSSQL,ORACLE,DB2,MYSQL,Access各类数据库使用GUID作为主键
- 使用JDBC如何获取数据库自动生成的主键
- 在Activiti中使用UUID作为主键生成策略
- Java用字符串生成的md5,sha1作为数据库主键, 去重
- mongodb使用-增删改查、colleciton关联、_id作为主键实现update
- MyBatis获取数据库自生成的主键Id详解及实例代码
- 使用php生成唯一ID的4种方法
- MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)
- PowerDesigner中在生成的数据库脚本中用name列替换comment列作为字段描述的方法