我有两张表有点像这样:
// 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]
通过他们的外键。
问题是,如果不删除一个外键约束、插入行,然后重新添加约束(这很蹩脚),就不可能创建第一个人/员工。
这里明显的上帝悖论是第一个“员工”并不是为了创造自己(“人”)而存在的。
有没有办法同时将数据插入两个表?这个 created-is-the-creator 场景只需要发生一次。如果我不能同时将数据插入两个表中,您的天才们还有其他方法建议吗?
澄清
还有其他表与“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