簡體   English   中英

如何使用最后插入的ID將行插入另一個表?

[英]How to insert a row into another table using last inserted ID?

我在我的SQL服務器GamerNameGamerValues上有兩個表,我想要,當我在GamerNameinsert一個新行時

 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中添加其他邏輯。

您不需要觸發器或任何@@IDENTITYSCOPE_IDENTITY()函數。 所有這些都有限制,它們都不能處理IDENTITY約束不產生的值。 它們都不能處理多次插入。

您可以使用INSERTOUTPUT子句將新插入的值復制到另一個表或表變量中。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM