Поддержание отношения внешнего ключа при вставке в таблицы с автоинкрементными идентификаторами - PullRequest
4 голосов
/ 25 августа 2011

У меня есть две таблицы: Defect и DefectData. Каждый Дефект может иметь или не иметь один или несколько Дефектных Данных. Таким образом, DefectData имеет столбец DefectId в качестве внешнего ключа.

Идентификатор в обеих таблицах является автоинкрементным идентификатором.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я хочу вставить новый Дефект и его Дефектные данные, Дефект вставляется первым и получает Id, но я не знаю, что этот Id должен дать DefectData. Мое решение состоит в том, чтобы затем выбрать из дефектов, соответствующих вставленным данным, чтобы получить идентификатор.

  1. Вставить дефект
  2. Получить идентификатор этого дефекта
  3. Вставить DefectData (ноль или много) с идентификатором от 2.

Установка IdentityInsert на включение и вставку с моим собственным идентификатором не будет работать, так как он выполняется веб-сервером и могут быть одновременные вызовы (я здесь?).

Diagram

Заранее спасибо.

1 Ответ

5 голосов
/ 25 августа 2011

Базовая схема такова: SCOPE_IDENTITY () для получения нового идентификатора строки из дефекта

BEGIN TRAN

INSERT Defect ()
VALUES (...)

INSERT DefectData (DefectID, AdditionalNotes, ...)
VALUES (SCOPE_IDENTITY(), @AdditionalNotes, ...)

COMMIT TRAN
...