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

新手上路,请多包涵

我创建了两个表:

  • Table tblStaff with columns id (primary key, auto increment), name , age , address

  • Table tblRoleOfStaff with columns id (primary key, auto increment), StaffId (foreign key to tblStaff ), RoleId

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

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

我想在 SQL Server 2014 中编写一个存储过程,将新员工插入到 tblStaff 并将新记录插入到 tbleRoleOfStaffstaffId

我应该怎么办?

如果我的问题与其他问题重复,我很抱歉。我对 SQL 比较陌生。谢谢你的帮助。

原文由 Ca Pham Van 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 500
2 个回答

使用 SCOPE_IDENTITY() 第二次插入 tblRoleOfStuffStaffId 的地方。喜欢:

 insert into tblStaff values
(@name, @age, @address)

insert into tblRoleOfStuff values
(scope_identity(), @roleid)

编辑

关于这个答案的评论太多了,所以我想给出一个解释。

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

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

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

为什么不 IDENT_CURRENT ?因为

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

所以你让最后一个范围,但不是当前的。是的,OP 也可以使用它,但在这种情况下这是一个不好的做法(比如只使用 @@IDENTITY

使用 OUTPUT 确实是一种很好的做法,但对于一个身份来说过于复杂。如果 OP 需要一次处理多于一行 - 是的,他需要 OUTPUT

原文由 gofr1 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您一次只插入一个员工行,您可以执行以下操作:

 begin try
 begin tran
  insert into tblStaff (name, age, address) values('my name',20,'San Jose');
  insert into tbleRoleOfStaff (StaffId, RoleId) values (SCOPE_IDENTITY(), 1);
 commit
end try
begin catch
  IF @@trancount > 0 ROLLBACK;
end catch

原文由 Ashwin Kambli 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进