Как предотвратить попадание внешних ключей? - PullRequest
1 голос
/ 18 августа 2010

Вот как выглядят мои таблицы:

tableMembers | memberID as primary key

tableAddress | addressID as primary key references memberID

tableSubscription | subsID as primary key references memberID

Эта база данных предназначена для сайта подписки.По сути, если строка вставляется в tableMembers, соответствующая строка вставляется в каждую из других таблиц.

Я установил внешние ключи для двух последних таблиц, чтобы иметь к ним доступ по отношению к tableMembers.В основном, если я получаю доступ к строке из tableAddress, я делаю:

SELECT * FROM tableAddress WHERE addressID = (SELECT memberID FROM tableMembers WHERE uname = 'John'); 

Проблема с моей настройкой состоит в том, что, когда синхронизация идентификаторов нарушается, внешние ключи больше не будут работать.Скажем, когда я вставляю строку в tableMembers, а затем tableSubscription перестает работать на несколько секунд по каким-то странным причинам?Или в случае регистрации пользователя ( последний идентификатор участника становится = 2 ), скажем, он / она не подписывается, что оставляет subsID (, который остается = 1 ) не синхронизированным с memberID.И позже новый пользователь регистрируется ( последний идентификатор участника становится = 3 ) и подписывается ( subsID становится = 2 ).Это делает мой запрос выше устаревшим.Как мне предотвратить такой сценарий?Или, пожалуйста, просветите меня, если вы думаете, что я не понимаю концепцию внешних ключей.

1 Ответ

2 голосов
/ 18 августа 2010

Убедитесь, что только одна из таблиц имеет идентификатор автоинкремента .Остальные должны получить свой идентификатор из запроса на вставку, из кода приложения, чтобы убедиться, что они для правильного члена.

В псевдокоде:

  1. Пользователь регистрируется иполучите идентификатор с автоинкрементом 3.
  2. Проверьте идентификатор с помощью last_insert_id ()
  3. Пользователь подписывается на что-то.Идентификатор в таблице tableSubscription должен быть установлен кодом вашего приложения на значение, которое вы получили ранее.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...