首页 > 解决方案 > 如何使用最后插入的 ID 在另一个表中插入一行?

问题描述

我的SQL服务器GamerName上有两张桌子GamerValues,当我insert有新的一行时,我想要那个GamerName

 GamerName

    ╔════╦═════════╦
    ║ ID ║  Name   ║
    ╠════╬═════════╬
    ║  1 ║ Jeff    ║
    ║  2 ║ Geoff   ║
    ║  3 ║ Jarrod  ║
    ║  4 ║ Joel Sp ║
    ╚════╩═════════╩

因此,使用insertedtable 上的最后一个 ID GamerName,应填写值GamerValues

 GamerValues

╔════╦══════════════╦════════╗
║ ID ║  GamerID     ║ Score  ║
╠════╬══════════════╬════════╣
║  1 ║ 1            ║ 5636   ║
║  2 ║ 2            ║  148   ║
║  3 ║ 3            ║  101   ║
║  4 ║ 4            ║  959   ║
╚════╩══════════════╩════════╝

是否可以通过单个查询来完成?

标签: sqlsql-server

解决方案


您不需要触发器或任何@@IDENTITY,SCOPE_IDENTITY()功能。它们都有限制,它们都不能处理不是由IDENTITY约束产生的值。它们都不能处理多个插入。

您可以使用OUTPUT子句INSERT将新插入的值复制到另一个表或表变量中。

OUTPUT 也可用于 UPDATE 和 DELETE。inserted.您可以使用anddeleted.前缀检索新的/修改的列

对于这些表:

create table #GamerName 
(
    ID int IDENTITY primary key, 
    Name nvarchar(20) not null
);
create table #GamerValues(
    ID int IDENTITY primary key,
    GamerID int not null,
    Score int not null
);

您可以插入新记录#GamerName并将生成的 ID 复制到#GamerValueswith :

INSERT INTO #GamerName (Name)
OUTPUT inserted.ID,0 into #GamerValues(GamerID,Score)
VALUES 
('Jeff'),
('Geoff'),
('Jarrod'),

新值出现在inserted虚拟表中。输出也可用

将为 GamerValues 中的每个玩家创建一个新行。让我们修改默认分数:

UPDATE #GamerValues 
SET Score=100

该表将如下所示:

ID  GamerID Score
1   1       100
2   2       100
3   3       100

添加另一个玩家

insert into #GamerName (Name)
output inserted.ID,0 into #GamerValues(GamerID,Score)
Values 
('Joel sp')

将产生一个分数为 0 的新行

ID  GamerID Score
1   1       100
2   2       100
3   3       100
4   4       0

推荐阅读