У меня есть две таблицы, вроде как это:Вставка 2 строки, которые связаны в обоих направлениях в SQL
// 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]
через их внешние ключи.
Проблема заключается в том, что невозможно создать первого человека/сотрудника без удаления одного из ограничений внешних ключей, вставляя строки, а затем добавляя ограничение (в котором довольно слабо).
Очевидный Божий парадокс здесь заключается в том, что первого «Работника» не существует, чтобы создать себя («Личность»).
Есть ли способ одновременно вставлять данные в две таблицы? Этот сценарий созданного-создателя должен произойти только один раз. Если я не могу вставить данные в две таблицы одновременно, есть ли какие-либо другие методы, которые вы, г-н Гении, предлагаете?
РАЗЪЯСНЕНИЕ
Есть другие таблицы, связанные с таблицей «Лицо» ... как «Студенты» и «Хранители». Человек не может переключать типы (Employee не может переключиться на Student или Guardian, а также на визу). Парадокс похож на таблицу Employee, в которой есть ManagerID FK; кроме как в моем случае таблицы были разделены.
РЕШЕНИЕ благодаря Remus Ruşanu и 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
Никогда не используйте @@ identity. Очень плохая практика для целостности данных. Вы находитесь в 2008 году, поэтому используйте выходную команду или scope_identity(). @@ identity выдаст неверные значения, если кто-либо когда-либо помещает триггер в вашу таблицу, который вставляет в другую таблицу с столбцом идентификации, очень опасно использовать. – HLGEM
+1 В моем случае я думаю, что SCOPE_IDENTITY() будет лучшим выбором; предложение OUTPUT будет немного выше верхнего правого? –