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

leo*_*ora 18 sql t-sql sql-server

我有一个主键设置为自动增量.

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

在进行插入查询时,有没有优雅的方法来取回主键值?现在我正在重新获得并在该专栏中获得最高价值,这看起来真的很糟糕.

有什么建议?

Ste*_*ass 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;
Run Code Online (Sandbox Code Playgroud)

输出可以指向表格以及客户端.例如:

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;
Run Code Online (Sandbox Code Playgroud)

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

  • +1另一个非常好的方法,如果PK不是一个身份 - 好的callè也可以 (2认同)

rom*_*n m 29

insert into YourTable values (...)
Run Code Online (Sandbox Code Playgroud)

使用scope_identity()获取新的PK

select scope_identity()
Run Code Online (Sandbox Code Playgroud)

  • 不再是最好的方法了。 (2认同)
  • 使用输出子句 (2认同)

小智 10

INSERT INTO YourTable (1, 2, etc.)
OUTPUT inserted.yourIDcolumn
VALUES (value1, value2, value...)
Run Code Online (Sandbox Code Playgroud)

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


har*_*rpo 5

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

IDENT_CURRENT('tablename') 存在并发问题。也就是说,不能保证在 INSERT 和 IDENT_CURRENT 调用之间不会插入另一条记录。

我必须承认,我不确定 VillageIdiot 的爆发所指的惊讶来源是什么,但我自己也很惊讶这个问题似乎根本不是重复的。