如何插入表并获取主键值?

时间:2009-09-01 03:57:54

标签: sql sql-server tsql

我将主键设置为自动增量。

我正在进行多个查询,我需要检索该主键值以用作另一个表(IsIdentity = TRUE)中的外键。

在执行插入查询时,是否有任何优雅的方法可以取回主键值?现在我正在重新考验并在该专栏中获得最高价值,这似乎真的很骇人。

有什么建议吗?

6 个答案:

答案 0 :(得分:37)

如果您使用的是SQL Server 2005或更高版本,则可以使用OUTPUT子句。

create table T(
  pk int identity primary key,
  dat varchar(20)
);
go

insert into T
output inserted.pk
values ('new item');
go

drop table T;

可以将输出定向到表格以及客户端。例如:

create table T(
  pk int identity primary key,
  dat varchar(20)
);

create table U(
  i int identity(1001,1) primary key,
  T_pk int not null,
  d datetime
);
go


insert into T
output inserted.pk, getdate()
into U(T_pk,d)
values ('new item'), ('newer item');
go

select * from T;
select * from U;
go

drop table T, U;

从SQL Server 2008开始,您可以使用“可组合DML”来获得更多可能性。

答案 1 :(得分:28)

insert into YourTable values (...)

使用scope_identity()

获取新的PK
select scope_identity()

答案 2 :(得分:10)

INSERT INTO YourTable (1, 2, etc.)
OUTPUT inserted.yourIDcolumn
VALUES (value1, value2, value...)

注意:这适用于MS SQL 2005及更高版本

答案 3 :(得分:4)

SCOPE_IDENTITY()可能就是你想要的。它返回由执行它的相同代码上下文插入的最后一条记录的ID。

IDENT_CURRENT('tablename')受并发问题的影响。也就是说,无法保证在INSERT和对IDENT_CURRENT的调用之间不会插入另一条记录。

我必须承认,我不确定VillageIdiot的爆发是什么意思,但我自己也很惊讶这个问题似乎并不重复。

答案 4 :(得分:2)

神圣的废话!!!

只需致电SCOPE_IDENTITY()功能:

insert into your_talble(col1,col2) values('blah','more blah')
select scope_identity()

因为如果任何其他语句进行插入,则选择最高值将返回错误。函数scope_identity()返回在当前上下文中创建的标识(即您的语句)

答案 5 :(得分:2)

您应该使用scope_identity()。我建议将insert语句和scope_identity()包装到事务中。