在插入时插入 SCOPE_IDENTITY

Posted

技术标签:

【中文标题】在插入时插入 SCOPE_IDENTITY【英文标题】:Insert SCOPE_IDENTITY at time of insert 【发布时间】:2013-05-06 16:33:25 【问题描述】:

我使用的是 SQL Server 2008。这是我的示例表

 SEQ   NAME  GROUP
  1    abc   1
  2    bcd   1
  3    cde   3

在上表中,SEQ 是我的身份列(自动编号)。如果我想插入一个 name = 'def' 和 group = 3 的新行,我可以这样做

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',3)

现在,如果我想插入一个新行,然后设置新插入行的 GROUP = SEQ,我分两步进行,如下所示

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',999)
UPDATE SampleTable SET GROUP = SEQ where NAME = 'def'

有什么方法可以一步完成吗?例如

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',SCOPE_IDENTITY())

上述语句显然不起作用,因为 SCOPE_IDENTITY() 仅在插入完成后设置。但是有没有办法使用单个插入语句来设置 GROUP = SEQ?

【问题讨论】:

有什么特殊原因必须在单个命令中完成? 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 @YuriyGalanter - 不。我只是想看看是否有更好或更优雅的方法来做到这一点 【参考方案1】:

一个小的改进是将UPDATE 更改为过滤SEQ

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',999)
UPDATE SampleTable SET GROUP = SEQ where SEQ = SCOPE_IDENTITY()

我更喜欢这个,因为我们很可能通过过滤SEQ 来获得聚集索引搜索。另外,我认为它在语义上更清晰。

我不知道有什么方法可以在一个带有IDENTITY 列的语句中做到这一点(即使想到OUTPUTMERGE 也没有想到)。您可以使用 SQL Server 2012 SEQUENCE 来完成此操作,但可以使用 INSERT...SELECT 语法。在选择部分,您从序列中弹出一个数字并将其复制到两列中。

【讨论】:

我喜欢性能改进建议!由于似乎没有办法在单个语句中执行此操作,因此我将继续使用双语句方法,但会根据您的建议进行改进。谢谢!【参考方案2】:

您可以在创建表时将 Group 设置为计算列,并将其值设置为 SEQ。然后您只需插入 NAME,SEQ 和 GROUP 都会自动设置

【讨论】:

只有当 GROUP 始终与 SEQ 相同或 GROUP 始终可以从 SEQ 计算时才有效。对于我的用例,它有时可能与 SEQ 相同,有时可能不同

以上是关于在插入时插入 SCOPE_IDENTITY的主要内容,如果未能解决你的问题,请参考以下文章

通过选择插入时,如何在插入表之前检查重复项

在没有要插入的数据时阻止查询插入

有没有办法在插入操作时检查 Hive 表中插入了多少行?

在插入时插入 SCOPE_IDENTITY

QAbstractItemModel:为啥在向模型中插入大量项目时发出 dataChanged 和插入行信号这么慢?

插入具有唯一 ID 的记录时,无法在触发器上执行多行插入