当前位置: 首页 > 知识库问答 >
问题:

如何将值插入到具有外键关系的两个表中?

裴卓君
2023-03-14

我创建了两个表:

>

  • 具有列 ID(主键、自动递增)、名称期限地址的表 tblStaff

    tblRoleOfBar包含列id(主键,自动增量),StaffIdtblBar的外键),RoleId

    我有表格来创建具有现有角色的新员工。要插入的数据示例:

    (name, age, address, roleId) = ('my name',20,'San Jose', 1)
    

    我想在SQL Server 2014中编写一个存储过程,将新的staff插入到<code>tblStaff。

    那我该怎么办?

    如果我的问题与其他问题重复,我很抱歉。我对SQL更感兴趣。谢谢你的帮助。

  • 共有3个答案

    齐磊
    2023-03-14

    您可以使用<code>从第一条insert语句输出。

    declare @tmp table(id int)
    insert tblStaff (name, age, address)
    OUTPUT inserted.Id INTO @tmp (id)
    values (@name, @age, @address)
    
    declare @roleId int = 1 --or whatever
    insert tblRoleOfStaff (staffId,roleId)
    select id, @roleId
    from @tmp
    

    您也可以一次插入多个角色。

    create table Roles (roleId int identity(1,1) primary key, 
    RoleName varchar(50),
    isDefaultRole bit default 0
    )
    --mark some roles as default (`isDefaultRole = 1`)
    --the 2nd insert will be
    insert tblRoleOfStaff (staffId,roleId)
    select id, roleId
    from @tmp
    cross join Roles
    where isDefaultRole = 1
    
    段干麒
    2023-03-14

    因为看起来您一次讨论一行,有些人可能会告诉您使用像@@IDENTITY或其他一些系统,但为了更确定地确保我推荐插入语句的OUTPUT子句。这种方法的好处是它可以很容易地适应一次处理多行。

    DECLARE @Output AS TABLE (StaffId INT)
    
    INSERT INTO tblStaff (name, age, address)
    OUTPUT inserted.Id INTO @Output (StaffId)
    VALUES (@name, @age, @address)
    
    DECLARE @StaffId INT
    SELECT @StaffId = StaffId FROM @Output
    
    INSERT INTO tblRoleOfStaff (StaffId, RoleId)
    VALUES (@StaffId,@RoleId)
    

    不使用< code>@@IDENTITY的原因,以防执行与您的操作相关的其他操作。例如,触发器将另一行插入到另一个表中,或者更新数据库中的另一条记录。,当触发器修改同一个表时,< code>SCOPE_IDENTITY也有类似的不足。< code>IDENT_CURRENT也有一个缺点。做一个互联网搜索来了解更多关于这些有大量的资源。

    蒋典
    2023-03-14

    使用SCOPE_IDENTITY()第二次插入到tblRoleOfStuff中,位于StaffId的位置。像:

    insert into tblStaff values
    (@name, @age, @address)
    
    insert into tblRoleOfStuff values
    (scope_identity(), @roleid)
    

    编辑

    对这个答案有太多的评论,所以我想解释一下。

    如果OP保证他不会使用任何触发器,他可以使用< code>@@IDENTITY(不好的做法),这足以满足他的需要,但最佳做法是使用< code>SCOPE_IDENTITY()。

    SCOPE_IDENTITY()与@@IDENTITY一样,将返回当前会话中创建的最后一个标识值,但它也将其限制在您当前的范围内。换句话说,它将返回您显式创建的最后一个标识值,而不是触发器或用户定义函数创建的任何标识。

    SCOPE_IDENTITY()将保证您从当前操作中获得标识,而不是从另一个连接或最后一个处理的连接中获得标识。

    为什么不IDENT_CURRENT?因为

    IDENT_CURRENT不受范围和会话的限制;它仅限于指定的表。IDENT_CURRENT返回为任何会话和任何作用域中的特定表生成的标识值。

    因此,您将其作为最后一个作用域,而不是当前作用域。是的,OP也可以使用它,但在这种情况下这是一种不好的做法(比如只使用@@IDENTITY

    使用< code>OUTPUT确实是很好的实践,但是对于一个身份来说太复杂了。如果OP需要一次处理不止一行——是的,他需要< code >输出。

     类似资料:
    • 批量订单 Purchorder 我已经试了一个星期了。我有这两个表,batchporder和purchord在batchporder表中,我需要插入一行,并获得传递给purchord插入的主id。在purchord中,我需要插入多行,因此我使用了insert\u batch。 控制器 模型 错误1 遇到PHP错误严重性:警告 消息:array_keys()要求参数1为数组,字符串为给定值 文件名:

    • 问题内容: 我有本身具有外键的表。列 parentid 是外键, 不能 为NULL。 如果我这样做,那么它说不能将NULL插入 父母的父母 。但是,如果还没有插入行,我可以为它设置什么值呢? 我如何编写将向该表添加行的脚本? 谢谢 问题答案: 技巧:拥有一个带有虚拟密钥的虚拟行,例如99999。将其插入为FK,然后将FK更改为其实际值。并在交易中完成。

    • 我在MySQL中有下表。 表1(身份证、名字、姓氏、电话号码) 表2(TID、电子邮件) 我在 Table1 中有 25000 行,而我的 Table2 包含 20000 行。我在表 2 中的 TID 是引用表 1 的主键 ID 的外键。如果姓氏为 NULL,则 Table2 中将不存在这些 ID。现在,我正在尝试仅针对具有姓氏的表合并这两个表。 我重新定义了表2的模式,如下所示。 Table2(

    • 我们系统的所有用户都来自一个主“用户”类。同样,我们希望以相同的方式构造数据库,拥有一个主“用户”表,该表与特定用户类型的必要表连接,以提供额外的用户信息。 以这三个基本表格为例: 表用户 user_id|user_email|user_firstname|user_lastname|... 表雇员 user_id|employee_staff_number|... 表管理 user_id|adm

    • 表1有col1、col2、col3、col4、col5列 表2有col1、col3、col5列 我想将表2中的行插入表1 但是col2,col4在插入表2后应该是NULL数据类型 我怎么能在蜂巢,目前我正在使用Hortonworks 3.1版本

    • 问题内容: 我有一个列表,例如:thing1,thing2,thing3。我想将它们插入具有相同外键的查找表中。因此理想情况下,它看起来应该像这样: 看来完成此操作的唯一方法是将列表转换为查询,但是我想知道,是否有更简单的方法? 这是我尝试过的: 我听说您无法在cfquery中执行cfloop,但是我什至不确定这是否成立,因为VALUES中没有逗号,并且我不确定如何说“ cfloop中的“当前迭代