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

标签 sql sql-server database sql-server-2014

我创建了两个表:

  • tblStaff 包含列 id(主键,自动递增)、nameage , 地址

  • tblRoleOfStaff 包含列 id(主键,自动递增),StaffId(tblStaff< 的外键), RoleId

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

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

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

我该怎么办?

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

最佳答案

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

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

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

编辑

这个回答评论太多,我想给个解释。

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

SCOPE_IDENTITY(), like @@IDENTITY, will return the last identity value created in the current session, but it will also limit it to your current scope as well. In other words, it will return the last identity value that you explicitly created, rather than any identity that was created by a trigger or a user defined function.

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

为什么不是 IDENT_CURRENT?因为

IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT returns the identity value generated for a specific table in any session and any scope.

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

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

关于sql - 如何将值插入到具有外键关系的两个表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37909314/

相关文章:

sql - 在PostgreSQL的同一查询中如何使用两个SUM()聚合函数?

sql-server - 如何将多个 Excel 列导入单个 SQL Server 列?

sql-server - float 和 [numeric](18, 10) 的区别

sql - 如何查看 SQL Server Management Studio 编辑器中制表位的位置?

mysql - SQL 命令不返回行

mysql - 为什么mysql unique let duplicate values to insert

sql - 在 SQLite 中连接三个表的最佳方式

mysql - 查询 sql 以与 python 一起使用

mysql - 选择不同的记录,同时从 MySQL 中选择第一次出现的记录

c# - 哪个数据库? Linq to SQL 类