如何提取刚刚插入到数据库记录的id

时间:2021-09-14 23:26:19
使用insert语句将数据插入到数据库中,马上想得到这条记录的id(自增字段),如何操作?

17 个解决方案

#1


可以根据插入的内容进行筛选,不过最好是插入到一个只有一个字段的表中,然后Select *,读出后直接删除:Delete *

#2


我没有更好的方法,但如果使用查询不也可以实现吗?只是麻烦些,我都这样。

#3


这是一个典范的数据库问题.搞数据库的都知道.
到目前仍没有那个数据库能返回这个值的.
要返回准确的ID.只能你插入的数据也需要有唯一的值,后用WHERE 子查询语句返回准确的ID.

#4


插入一条记录,然后再查最后的一条记录这种方法我早先也用过,但这种方式有一个问题就是当有两个人以上同时向数据库里插入记录时就有问题了,你提出的id很可能不是你刚才插入的那条记录的id.这种情况常发生在访问量较大的网站数据库里.所在想找一种能够解决这种问题的方法.
不知哪们大XX可告知.

#5


自己生成ID,不要用系统给的

读旧ID,生成新ID
insert into
delete

ID一直保存在变量内

#6


用DataSet而不是直接用执行insert into语句
DataSet.Update会自动提取ID

#7


用存储过程,然后用ADO.NET调用!
------------------------------------------------
-- 添加用户------------------------------------------------
CREATE PROCEDURE InsertUser
    @Email NVARCHAR(40) = NULL,
    @Password       NVARCHAR(10) = NULL,
    @Guid     NVARCHAR(10) = NULL,
    @PKId           INT = NULL OUTPUT
AS
    SET NOCOUNT ON
    INSERT into UserAccount(Email, 
                      Password, 
                     Guid) values(@Email,@Password,@Guid)
    SELECT @PKId = @@IDENTITY

    RETURN 0
------------------------------------------------


GO

#8


insert into 后

Select Max(Id) As CurrMaxId From TableName .....

#9


我的办法最简单

select ident_current('table_name')

#10


用事务处理试下

#11


用 @@identity
他返回最后生成的自动编号列的值。c#中是Decimal类型,
在insert之后select @@indentity

#12


有三种类似方法
IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
详细情况看sql server 在线文档

#13


可以使用存储过程的返回值,建议使用这种方法,因为这样有助于提高后台数据库的运行效率,同时可以最大限度减少表的锁定问题

其余可以使用上头说的IDENT_CURRENT @@IDENTITY SCOPE_IDENTITY 等等
最无聊的办法就是使用条件检索查询了

#14


用 @@identity ,Sqlserver内自带的。
最好用存储过程来增加记录,然后获取并返回@@identity就可以了。

它返回最后生成的自动编号列的值。

#15


ident_current('table_name')

#16


ADO.NET  中,用COMMAND语句的@@IDENTITY得到值
但是在并发的时候可能会出现问题
或者
用RECORDSET的ADDNEW 方法,然后UPDATE
这样就能够返回需要的自增的ID

#17


多谢大家给的提示,问题已经找到答案了.
我是这样做的.
在数据表里用个时间字段,而这个时间是由程插入的
也就是
DateTime CreateTime=DateTime.Now()
然后
执行"insert into TabName(CreateTime) values('"+CreateTime+"')"
然后再"select * from TabName where CreateTime='"CreateTime"'"
就行了,有关文章说时间类型虽然只能表示到秒一级,但实际在内部是以毫秒为单位的,所以这样做应该没什么问题了.
我过我还是要把分送给各位了.

#1


可以根据插入的内容进行筛选,不过最好是插入到一个只有一个字段的表中,然后Select *,读出后直接删除:Delete *

#2


我没有更好的方法,但如果使用查询不也可以实现吗?只是麻烦些,我都这样。

#3


这是一个典范的数据库问题.搞数据库的都知道.
到目前仍没有那个数据库能返回这个值的.
要返回准确的ID.只能你插入的数据也需要有唯一的值,后用WHERE 子查询语句返回准确的ID.

#4


插入一条记录,然后再查最后的一条记录这种方法我早先也用过,但这种方式有一个问题就是当有两个人以上同时向数据库里插入记录时就有问题了,你提出的id很可能不是你刚才插入的那条记录的id.这种情况常发生在访问量较大的网站数据库里.所在想找一种能够解决这种问题的方法.
不知哪们大XX可告知.

#5


自己生成ID,不要用系统给的

读旧ID,生成新ID
insert into
delete

ID一直保存在变量内

#6


用DataSet而不是直接用执行insert into语句
DataSet.Update会自动提取ID

#7


用存储过程,然后用ADO.NET调用!
------------------------------------------------
-- 添加用户------------------------------------------------
CREATE PROCEDURE InsertUser
    @Email NVARCHAR(40) = NULL,
    @Password       NVARCHAR(10) = NULL,
    @Guid     NVARCHAR(10) = NULL,
    @PKId           INT = NULL OUTPUT
AS
    SET NOCOUNT ON
    INSERT into UserAccount(Email, 
                      Password, 
                     Guid) values(@Email,@Password,@Guid)
    SELECT @PKId = @@IDENTITY

    RETURN 0
------------------------------------------------


GO

#8


insert into 后

Select Max(Id) As CurrMaxId From TableName .....

#9


我的办法最简单

select ident_current('table_name')

#10


用事务处理试下

#11


用 @@identity
他返回最后生成的自动编号列的值。c#中是Decimal类型,
在insert之后select @@indentity

#12


有三种类似方法
IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
详细情况看sql server 在线文档

#13


可以使用存储过程的返回值,建议使用这种方法,因为这样有助于提高后台数据库的运行效率,同时可以最大限度减少表的锁定问题

其余可以使用上头说的IDENT_CURRENT @@IDENTITY SCOPE_IDENTITY 等等
最无聊的办法就是使用条件检索查询了

#14


用 @@identity ,Sqlserver内自带的。
最好用存储过程来增加记录,然后获取并返回@@identity就可以了。

它返回最后生成的自动编号列的值。

#15


ident_current('table_name')

#16


ADO.NET  中,用COMMAND语句的@@IDENTITY得到值
但是在并发的时候可能会出现问题
或者
用RECORDSET的ADDNEW 方法,然后UPDATE
这样就能够返回需要的自增的ID

#17


多谢大家给的提示,问题已经找到答案了.
我是这样做的.
在数据表里用个时间字段,而这个时间是由程插入的
也就是
DateTime CreateTime=DateTime.Now()
然后
执行"insert into TabName(CreateTime) values('"+CreateTime+"')"
然后再"select * from TabName where CreateTime='"CreateTime"'"
就行了,有关文章说时间类型虽然只能表示到秒一级,但实际在内部是以毫秒为单位的,所以这样做应该没什么问题了.
我过我还是要把分送给各位了.