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"来获得更多可能性.
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)
小智 10
INSERT INTO YourTable (1, 2, etc.)
OUTPUT inserted.yourIDcolumn
VALUES (value1, value2, value...)
Run Code Online (Sandbox Code Playgroud)
注意:这适用于MS SQL 2005及更高版本
SCOPE_IDENTITY() 可能就是您想要的。它返回由其执行所在的同一代码上下文插入的最后一条记录的 ID。
IDENT_CURRENT('tablename') 存在并发问题。也就是说,不能保证在 INSERT 和 IDENT_CURRENT 调用之间不会插入另一条记录。
我必须承认,我不确定 VillageIdiot 的爆发所指的惊讶来源是什么,但我自己也很惊讶这个问题似乎根本不是重复的。
归档时间: |
|
查看次数: |
43573 次 |
最近记录: |