在 SQL 脚本中引用生成的主键

Posted

技术标签:

【中文标题】在 SQL 脚本中引用生成的主键【英文标题】:Reference generated primary key in SQL script 【发布时间】:2009-01-16 00:53:21 【问题描述】:

我正在尝试使用单个脚本在数据库中创建一堆条目,我遇到的问题是如何引用我创建的上一个条目的生成主键。

例如,如果我创建了一个客户,然后尝试为该客户创建订单,我如何获取为该客户生成的主键?

我正在使用 SQLServer。

【问题讨论】:

【参考方案1】:

像这样:

DECLARE @customerid int;
INSERT INTO customers(name) VALUES('Spencer');
SET @customerid = @@IDENTITY;

编辑:

显然它需要 SCOPE_IDENTITY() 才能按预期使用触发器。

DECLARE @customerid int;
INSERT INTO customers(name) VALUES('Spencer');
SET @customerid = SCOPE_IDENTITY();

【讨论】:

我相信在大多数情况下,scope_identity() 比@@IDENTITY 更受欢迎。 +1 for Joels note,scoped_identity 将优雅地处理触发器(例如,如果您有插入触发器,您的 @@identity 可能会变成假的) 成功了,谢谢,我正在使用似乎支持 scope_identity() 的 SQLServer 2005。 Kenny,SQLServer 2005甚至2000都支持scope_identity(),使用起来比@@identity更安全。【参考方案2】:

如果在您的版本中可用,请改用 SCOPE_IDENTITY()。比@@IDENTITY 更安全。

【讨论】:

【参考方案3】:

如果您一次插入多行,您可以使用OUTPUT INTO feature of SQL Server 2005 or later 获取所有标识(例如,用于创建相关记录)。

这可以避免您编写循环和游标等。

【讨论】:

以上是关于在 SQL 脚本中引用生成的主键的主要内容,如果未能解决你的问题,请参考以下文章

数据库增删改查

使用生成的主键引用表

sql 获取当前插入的主键 表主键是guid类型的

如何分清SQL数据库中的主键与外键

得到数据库自动生成的主键值

在 SQL Server CE 和 C# 中获取新插入行的主键?