0

У меня есть эти отношения:Вставка записи в базу данных со сквозными внешних ключей

enter image description here

Где CurrentVersionID указывает на текущую активную версию игры.

В ArcadeGameVersionGameID Недвижимость указывает на соответствующую запись ArcadeGame.

Проблема в том, что я не могу вставить либо запись:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_ArcadeGame_ArcadeGameVersions". The conflict occurred in database "Scirra", table "dbo.ArcadeGameVersions", column 'ID'. 

Является ли это плохо формируется структура данных? В противном случае, какое наилучшее решение для преодоления этого?

ответ

0

Кажется, плохо сформировался. Я не понимаю, зачем вам нужна эта циркулярная ссылка. Я бы использовал только одну таблицу ArcadeGame с дополнительными полями CurrentVersion и UploadDate. Вы можете запросить его на основе UploadDate, например, в соответствии с вашими потребностями. Если вы объясните, что вы хотите от этого db, ответ может быть более конкретным.

+0

Как вы бы структурировали его? –

0

Эта структура может работать, если вам это нужно, чтобы быть таким образом .. предполагая, что идентификаторы являются полями идентичности, я считаю, что вам нужно будет сделать это в 5 шагов:

  1. Вставьте запись ArcadeGame с нулем значение для CurrentVersionId
  2. Определить значение идентификатора записи только что добавили, используя заявление, как: SELECT @arcadeGameId = SCOPE_IDENTITY()
  3. Вставьте запись ArcadeGameVersion, установив GameID к значению, определенному в предыдущем шаге
  4. Определить значение идентификатора Ок (только с помощью SCOPE_IDENTITY())
  5. Обновить запись ArcadeGame (где идентификатор соответствует значению, определенному на шаге 2), и установить значение CurrentVersionId на значение, определенное на предыдущем шаге.

Вы, скорее всего, захотите сделать это в рамках транзакции.

Если идентификаторы не являются полями идентификации, и вы знаете значения заранее, вы можете в основном выполнять те же действия, что и выше, но пропустить шаги SELECT SCOPE_IDENTITY().