日期:2014-05-16  浏览次数:20515 次

表的主键是int自增列,如何在插入一条新数据时立即获得该记录的主键字段值?
以前做项目,数据库中表的记录主键都是用一个 GUID 来生成,但是总觉得GUID可读性很差,不好识别。

所以本次做项目时,表的主键统一用int自增型做ID。

结果发现一个问题就是,当你刚刚插入一条记录到这张表中时,不需要指定主键,因为是自增列,

但是,你后续可能立即需要把这条记录的主键传递到其他地方去,这时候,你手中并没有这个主键值,因为这个主键值是DB帮你生成并自动插入的。

这时候怎么办呢?我现在的做法是立即按ID逆序查询最近的一条,拿到主键值。

但是!!!!当你插入完成后,立即有另一个用户正好插入了一条记录,等到你回头再去取最近一条时,取到的记录实际上并不是你自己最近插入的那一条了!!!!!

尤其是当系统用户非常多,上万个用户同时录入时,那这个BUG出现的概率将会非常高!!!

请教各位大大,这个问题如何解决???非常感谢
------解决方案--------------------
select @@IDENTITY

------解决方案--------------------
create table tb (id int identity(1,1) primary key,aa int)
insert into tb values(10)
select @@IDENTITY
drop table tb
------解决方案--------------------
@@IDENTITY、
SCOPE_IDENTITY 
IDENT_CURRENT 

三个都可以
------解决方案--------------------
引用:
难道需要把insert与select语句封装到一个 事务里面来???


对的 在同一事务。
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

难道需要把insert与select语句封装到一个 事务里面来???


对的 在同一事务。


唉呀,那这样子好麻烦呀。。。。。能不能在数据库中建个存储过程,里面是一个事务,事务里面又包括了insert及select语句,最后返回值是ID,这样子?

可以将ID OUTPUT出来啊 按照你说的做也可以
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

难道需要把insert与select语句封装到一个 事务里面来???


对的 在同一事务。


唉呀,那这样子好麻烦呀。。。。。能不能在数据库中建个存储过程,里面是一个事务,事务里面又包括了insert及select语句,最后返回值是ID,这样子?
create table a(id int identity(1,1),b int)

GO
CREATE PROCEDURE [dbo].[p_identity]
@a int -- 输入
,@Returnc int output --输出
AS 
insert into a(b) values(@a)
select @@IDENTITY

GO
-- 调用
declare @Returnc int 
exec [p_identity]  2,@Returnc output 

drop PROCEDURE [dbo].[p_identity]
drop table a