表的主键是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
三个都可以
------解决方案--------------------
对的 在同一事务。
------解决方案--------------------
可以将ID OUTPUT出来啊 按照你说的做也可以
------解决方案--------------------
难道需要把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