我将主键设置为自动增量。
我正在进行多个查询,我需要检索该主键值以用作另一个表(IsIdentity = TRUE
)中的外键。
在执行插入查询时,是否有任何优雅的方法可以取回主键值?现在我正在重新考验并在该专栏中获得最高价值,这似乎真的很骇人。
有什么建议吗?
答案 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()
获取新的PKselect 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()包装到事务中。