我有两个类似这样的表:
// 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/