sql - 在 SQL 中插入两个方向相关的 2 行

标签 sql sql-server sql-server-2008 insert relational

我有两个类似这样的表:

// Person.Details Table:
PersonID int [PK] | EmployeeCreatorID int [FK] | FirstName varchar | OtherInfo...

// Employee.Details Table:
EmployeeID int [PK] | PersonID int [FK] | IsAdmin bit | OtherInfo...

每个表都相互关联:

[Employee.Details.PersonID]===>[Person.Details.PersonID] AND
[Person.Details.EmployeeCreatorID]===>[Employee.Details.EmployeeID]

通过他们的外键。

问题是,如果不删除其中一个外键约束、插入行,然后重新添加约束(这是非常蹩脚的),就不可能创建第一个人/员工。

这里明显的上帝悖论是第一个“雇员”并不存在来创造自己(“人”)。

有没有办法同时向两个表中插入数据?这种被创造者就是创造者的场景只需要发生一次。如果我不能同时向两个表中插入数据,那么天才们还有其他方法吗?

澄清

还有其他与“Persons”表相关的表...例如“Students”和“Guardians”。一个人不能转换类型(员工不能转换为学生或监护人,反之亦然)。该悖论类似于具有 ManagerID FK 的 Employee 表;除了在我的例子中,表格是分开的。

解决方案 感谢 Remus Rusanu 和 b0fh

--/*seeds database with first employee*/
BEGIN TRAN
GO
INSERT INTO Person.Details
    (EmployeeCreatorID, FirstName, Active)
VALUES
    (@@Identity, 'Admin', 1)
DECLARE @Identity int;
SET @Identity = @@Identity;
INSERT INTO Employee.Details 
    (PersonID, IsAdmin, Email, Password) 
VALUES
    (@Identity, 1, 'admin', 'admin')
UDPATE
    Person.Details
SET
    EmployeeCreatorID = @@Identity
WHERE
    PersonID = @Identity

IF(@@ERROR <> 0)
    ROLLBACK TRAN
ELSE
    COMMIT TRAN

最佳答案

NULL 键将通过外键约束。您可以插入一个具有 NULL CreatorID 的 Person,这将成为整个层次结构的祖父。

您还可以插入禁用约束,插入第一对(Person,Employee)彼此指向,然后启用约束,从现在开始系统被播种。

关于sql - 在 SQL 中插入两个方向相关的 2 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2330601/

相关文章:

sql-server - FluentNHibernate - 设置数据库列的默认值(SQL Server)

mysql - 如何从两个表中进行选择?

sql - 我可以与 HAVING 子句一起使用的第一个聚合函数

c# - 使用 C# 进行 SQL Server 备份

performance - Server 2008上HTTPWebRequest的性能问题(在xp上精细)

database - 是否可以更改 View 中列的数据类型?

sql - 查询以计算演出收入占所有演出总收入的比例

android - 按总和排序(分数)desc 返回错误结果

mysql - 基于 MySQL、H2 和 DB2 列子集的具有唯一值的 SELECT

sql-server - 确定哪个 SQL Server 数据库占用了 CPU 资源