![](/img/trans.png)
[英]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.