Ограничения внешнего ключа с автоматически сгенерированными ключами, основной вопрос (InnoDB) - PullRequest
1 голос
/ 11 июня 2011

Я новичок в ограничениях внешнего ключа. Я сформулирую простой пример, чтобы объяснить мою ситуацию.

У меня есть таблица user и таблица entry. В user есть user.firstEntry, который является внешним ключом для entry.EntryID. В entry есть entry.userID, который является внешним ключом к таблице user.userID. Все эти идентификаторы являются автоматическими значениями приращения.

Запрещены ли подобные циклы? Тогда мне придется менять дизайн?

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

Что мне делать?

Спасибо

Ответы [ 3 ]

1 голос
/ 11 июня 2011

Предполагается, что ограничение внешнего ключа не позволит вам добавить недопустимые данные в столбец внешнего ключа.

В большинстве случаев он проверяет, действительно ли значение существует в указанной таблице. Поскольку у вас есть цикл в таблице user и entry, при попытке создать запись он проверит, существует ли значение entry.userID в таблице user. Он будет делать то же самое, когда вы пытаетесь добавить нового пользователя, он проверит в таблице записей значение, которое вы ввели для user.firstEntry. Если и пользователь, и запись являются новыми, невозможно связать их из-за вашего цикла. Для новой записи требуется существующий пользователь, а для новой записи - существующая запись. Когда обе таблицы пусты, я не думаю, что вы сможете выполнить ограничение.

Я бы предложил сохранить внешний ключ для userID в таблице записей (поскольку я предполагаю, что записи связаны с пользователями) и найти какой-либо другой способ представления первой записи пользователя. Может быть, таблица user_entry_history или что-то в этом роде.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ - Прошло некоторое время с тех пор, как я испортил дизайн базы данных.

1 голос
/ 11 июня 2011

Немного странный дизайн, но вы можете сделать это:

При создании пользователя установите firstEntry в NULL.Вставьте запись с идентификатором этого пользователя.Обновите Users и установите firstEntry на id вставленной записи.

1 голос
/ 11 июня 2011

И пользователь, и запись должны быть уже созданы заранее. и поскольку ни один из них не может быть создан без другого, у вас возникнет эта проблема IF проверка внешних ограничений включена.

Что бы я не понял из вашего вопроса, у каждого пользователя, кажется, есть несколько записей. Таким образом, ваш дизайн таблицы может выглядеть как Table_User (user_id (pk), user_name и т. Д.), А таблица записей может быть Table_Entry (entry_id (pk), entry_whothing, ..., user_id (fk to user table)) независимо, но записи зависят от пользователей.

...