sql - 如何使用最后插入的 ID 在另一个表中插入一行?
问题描述
我的SQL
服务器GamerName
上有两张桌子GamerValues
,当我insert
有新的一行时,我想要那个GamerName
GamerName
╔════╦═════════╦
║ ID ║ Name ║
╠════╬═════════╬
║ 1 ║ Jeff ║
║ 2 ║ Geoff ║
║ 3 ║ Jarrod ║
║ 4 ║ Joel Sp ║
╚════╩═════════╩
因此,使用inserted
table 上的最后一个 ID GamerName
,应填写值GamerValues
GamerValues
╔════╦══════════════╦════════╗
║ ID ║ GamerID ║ Score ║
╠════╬══════════════╬════════╣
║ 1 ║ 1 ║ 5636 ║
║ 2 ║ 2 ║ 148 ║
║ 3 ║ 3 ║ 101 ║
║ 4 ║ 4 ║ 959 ║
╚════╩══════════════╩════════╝
是否可以通过单个查询来完成?
解决方案
您不需要触发器或任何@@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 复制到#GamerValues
with :
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
推荐阅读
- r - 如何在R中的数据帧的一行中找到两个最高值和两个最低值
- graphics - android 12 移植:Surfaceflinger 死锁
- reactjs - 如何在自定义插件中实现共享十字准线 - Grafana
- pandas - 概率变异数据框
- php - 在 Laravel 中检索列值数组的更好方法?
- php - PHP:在类中调用具有返回值的函数
- python - 在 spacy 训练数据中基于 NER 实体标签过滤数据
- c++ - 如何获取有关代码包含的文件、类和函数的信息?
- gitlab - 如何在 GitLab 中列出/删除所有空存储库。?
- java - Spark java数据帧增量col