如何使用最后插入的ID将行插入另一个表?

时间:2018-05-18 07:34:19

标签: sql sql-server

我的SQL服务器GamerNameGamerValues上有两张桌子,我想{I} insert GamerName }

 GamerName

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

因此,使用表inserted上的最后一个GamerName ID,值应填入GamerValues

 GamerValues

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

是否可以使用单个查询执行此操作?

4 个答案:

答案 0 :(得分:2)

您应该使用存储过程来管理它。您可以通过这种方式集中创建新游戏玩家所需的任何其他逻辑(例如,检查是否已存在)。

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约束确保游戏玩家名称的唯一性,我只是使用EXISTS来说明如何在SP中添加其他逻辑。

答案 1 :(得分:2)

您不需要触发器或任何@@IDENTITYSCOPE_IDENTITY()功能。所有这些都有限制,它们都不能处理IDENTITY约束不会产生的值。他们都不能处理多次插入。

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

OUTPUT也可用于UPDATE和DELETE。您可以使用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

答案 2 :(得分:0)

您必须为此添加触发器。

CREATE TRIGGER newTrigger ON GamerName
FOR INSERT
AS

INSERT INTO GamerValues
        (GamerID)
    SELECT
        'ID'
        FROM inserted

GO

Btw得分变量默认设置为0,因为创建新用户时没有值。除非你这样做。

希望这有帮助

答案 3 :(得分: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 是最佳选择