[英]Get ID of last inserted row and use it to insert into another table in a stored procedure
[英]How to insert a row into another table using last inserted ID?
我在我的SQL
服务器GamerName
和GamerValues
上有两个表,我想要,当我在GamerName
上insert
一个新行时
GamerName
╔════╦═════════╦
║ ID ║ Name ║
╠════╬═════════╬
║ 1 ║ Jeff ║
║ 2 ║ Geoff ║
║ 3 ║ Jarrod ║
║ 4 ║ Joel Sp ║
╚════╩═════════╩
因此,使用GamerName
表上最后inserted
ID,应在GamerValues
上填充值
GamerValues
╔════╦══════════════╦════════╗
║ ID ║ GamerID ║ Score ║
╠════╬══════════════╬════════╣
║ 1 ║ 1 ║ 5636 ║
║ 2 ║ 2 ║ 148 ║
║ 3 ║ 3 ║ 101 ║
║ 4 ║ 4 ║ 959 ║
╚════╩══════════════╩════════╝
是否可以使用单个查询执行此操作?
您应该使用存储过程来管理它。 您可以通过这种方式集中创建新游戏玩家所需的任何其他逻辑(例如,检查是否已存在)。
CREATE PROCEDURE dbo.CreateGamer
@Name VARCHAR(100)
AS
BEGIN
IF EXISTS (SELECT 'gamer name already exists' FROM GamerName AS G WHERE G.Name = @Name)
BEGIN
RAISERROR('Gamer name already used!', 16, 1)
RETURN
END
INSERT INTO GamerName (
Name)
VALUES
(@Name)
DECLARE @GamerID INT = SCOPE_IDENTITY()
INSERT INTO GamerValues (
GamerID,
Score)
SELECT
GamerID = @GamerID,
Score = 0
END
您可以使用UNIQUE
约束确保游戏者名称的UNIQUE
,我只是使用EXISTS
来展示如何在SP中添加其他逻辑。
您不需要触发器或任何@@IDENTITY
, SCOPE_IDENTITY()
函数。 所有这些都有限制,它们都不能处理IDENTITY
约束不产生的值。 它们都不能处理多次插入。
您可以使用INSERT
的OUTPUT子句将新插入的值复制到另一个表或表变量中。
OUTPUT也可用于UPDATE和DELETE。 您可以使用inserted.
方式检索新的/修改的列inserted.
并deleted.
前缀
对于这些表格:
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
:
INSERT INTO #GamerName (Name)
OUTPUT inserted.ID,0 into #GamerValues(GamerID,Score)
VALUES
('Jeff'),
('Geoff'),
('Jarrod'),
inserted
虚拟表中将显示新值。 OUTPUT也可用
将为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
您必须为此添加触发器。
CREATE TRIGGER newTrigger ON GamerName
FOR INSERT
AS
INSERT INTO GamerValues
(GamerID)
SELECT
'ID'
FROM inserted
GO
顺便说一句,得分变量默认设置为0,因为创建新用户时没有值。 除非你这样做。
希望这可以帮助
如果您在Gamername Table中有一个标识列,则可以使用
INSERT INTO GamerName (Name)VALUES
('Joel Sp');
INSERT INTO GamerValues (GamerID,Score)
SELECT SCOPE_IDENTITY() ,0 score;
如果您只需要插入最后一列并假设gamername表中的游戏者ID是顺序的,那么您可以简单地使用
INSERT INTO GamerValues (GamerID,Score)
select max(id),0 score from gamername;
如果没有什么能满足您的条件,那么TRIGGER是最佳选择
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.