当前位置: 首页 > 面试题库 >

通过SQL更新单个记录并获取已更新记录的ID的最佳方法是什么?(Java / MSSQL)

钮晟
2023-03-14
问题内容

我知道我可以像这样更新一条记录-但是如何获取已更新记录的ID?(我正在使用MSSQL,所以不能使用Oracle的RowId)

update myTable
set myCol = 'foo'
where itemId in (select top 1 itemId from myTable )

如果我要执行插入操作,则可以使用getGeneratedKeys来获取id字段值,但是我不认为有等效的更新吗?

我知道我可以使用可滚动的结果集来做我想做的事

stmt = conn.prepareStatement("select top 1 myCol, itemId from myTable", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet resultSet = stmt.executeQuery();
if(resultSet.first()){
    resultSet.updateString(1, "foo");
    resultSet.updateRow();
    String theItemId = resultSet.getString(1)
}
resultSet.close();

但是我担心性能,因为测试显示负载下的锁定超时,我想知道是否有更好/更简单的方法?

-编辑:为了最终解决这个问题…当我们迁移到MSSQL2005时,我们将升级代码以使用Rich的答案。在当前版本中,我们使用了锁定提示:(UPDLOCK ROWLOCK READPAST)来减轻原始代码显示的性能问题。


问题答案:

这个例子在MSSQL 2005中确实很好用…

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

DROP TABLE [dbo].[TEST_TABLE]
GO

CREATE TABLE [dbo].[TEST_TABLE](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [nvarchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
 CONSTRAINT [PK_TEST_TABLE] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


-- An insert which will return the identity
INSERT INTO [dbo].[TEST_TABLE] ([name]) 
OUTPUT inserted.id
VALUES('Test 1')

-- Another insert which will return the identity
INSERT INTO [dbo].[TEST_TABLE] ([name]) 
OUTPUT inserted.id
VALUES('Test 2')

-- Now an update which will return the identity
UPDATE [dbo].[TEST_TABLE]
SET [name] = 'Updated Test 1'
OUTPUT inserted.id
WHERE [name] = 'Test 1'

SELECT id, [name] FROM [dbo].[TEST_TABLE]

更具体地说是您的查询…

update myTable
set myCol = 'foo'
output inserted.itemid
where itemId in (select top 1 itemId from myTable )


 类似资料:
  • 问题内容: 如何获取刚刚插入的新记录的自动生成的ID?(使用ASP Classic和MSSQL 2005) 问题答案: 感谢所有建议SELECT SCOPE_IDENTITY()的人。我能够创建一个存储过程: 并使用VB调用存储过程: 现在,只要我引用新创建的ID,就可以使用resultID。

  • 我在MySQL中处理一个查询,它会给我一个特定ID的最新时间戳,但在列中保留它的空值,这是group by使它很难做到的。 在我的日志数据库中,我知道如果最新记录包含错误消息,则可以将其视为“失败”,但使用group by会给我该消息的最新错误消息,而不管它是否是最新记录。 因此,我尝试选择带有MAX(Timestamp)的最新值来获取该消息的最新记录,以便检查ErrorMsg列是否为空。 是否有

  • 问题内容: 我有三个表: 我需要获取每次测量的最新事件(过去的事件)及其相关的eventvalues数据。 我当前的查询很丑陋: 而且只允许我从表格中选择一列(我需要更多) 有什么方法可以使用联接来完成此操作吗? 编辑 :即使它们在第一个事件之前,我也需要从测量表中选择所有条目(即,为连接选择空数据) 问题答案: 您可以使用CROSS APPLY。

  • 更新记录 V2.0.0 加入寄存器运行模式,可大幅提升热更内数值计算性能 执行性能整体提升,传统非寄存器模式执行效率也得到一定幅度提升 修正热更内finnaly块在一些情况下不正确的bug,连带修复了yield return和async/await的一些异常情况 修正值对类型绑定后的数组进行操作时的异常 修正热更内Enum一些情况下Equals结果错误的bug 修正跨域继承接口时的一些异常情况 修

  •  版本更新记录 2016.09.10 1) 底层组件-新增时间处理集合 2016.09.5 1) 底层组件-优化防刷 2) 底层组件-错误监控 2) 底层组件-优化通过类名绑定相关事件 2016.08.25 1) 底层组件-新增百度统计组件 2016.08.11 1) 底层组件-优化udb定制登录,增加QQ登录 2) 活动组件-新增完成任务组件 2016.08.9 1) 活动组件-新增防刷组件

  • 本文向大家介绍ASP获取新增记录ID值的方法,包括了ASP获取新增记录ID值的方法的使用技巧和注意事项,需要的朋友参考一下 ASP+Access2000 1.要获取的ID值字段属性必须设为:自动编号(我们假设字段名为recordID) 2.添加记录格式:Rs.Open table,Cn,1,3 注意模式为:1,3 3.newID = rs.Fields("recordID") 4.newID为刚添