繁体   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