Какой это должен быть ключ? - PullRequest
0 голосов
/ 08 февраля 2012

Это может быть действительно простой проблемой для некоторых людей, но мне трудно ее понять.

Сценарий: я работаю со школьной базой данных.У меня есть таблица, которая связывает класс с предметом под названием 'subject_class'.

Класс может быть частью более чем одного предмета, а предмет может содержать более одного класса.Итак, насколько я понимаю, это отношение «многие ко многим» в таблице.

Пример того, как будет выглядеть база данных:

subject_id          class_id
    1                 14
    1                 15
    2                 14
    *1                *14

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

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

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

Ответы [ 6 ]

3 голосов
/ 08 февраля 2012

Вы хотели бы иметь уникальный ключ для subject_id и class_id для предотвращения дублирования. Но вам НУЖНО убедиться, что ваше приложение может либо: обработать ошибку, возникающую при попытке вставить комбинацию значений, которая уже существует, и попытаться предотвратить отправку дубликатов в первую очередь.

В качестве альтернативы, если вы хотите, чтобы последующая вставка перезаписывала существующую запись, вам следует выяснить, может ли программное обеспечение вашей базы данных обрабатывать ON DUPLICATE KEY UPDATE.

0 голосов
/ 08 февраля 2012

Создайте первичный ключ для двух полей

ALTER TABLE subject_class ADD PRIMARY KEY (subject_id, class_id)

, но вам нужно будет удалить дубликаты, прежде чем вы сможете добавить индекс.

0 голосов
/ 08 февраля 2012

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

На уровне базы данных вы можете использовать составной уникальный ключ. Для однозначной идентификации строки.

alter table subject_class ADD UNIQUE INDEX sanity (subject_id, class_id);
0 голосов
/ 08 февраля 2012

Требуется уникальный ключ, охватывающий обе строки. Таким образом, оба столбца каждый могут содержать неуникальные данные, но не в комбинации

ALTER TABLE subject_class ADD UNIQUE INDEX sanity (subject_id, class_id);
0 голосов
/ 08 февраля 2012

Добавьте УНИКАЛЬНОЕ в оба поля.

ALTER TABLE `table` ADD UNIQUE (  `subject_id` ,  `class_id` ) ;
0 голосов
/ 08 февраля 2012

Практически все, что вам нужно, это один UNIQUE, примененный к обоим столбцам. Общий процесс выглядит следующим образом: приложение пытается сохранить отношение без проверки до начала действия и ожидает ответа базы данных. В случае дублирования вставка возвращает ошибку, которая должна быть обработана в приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...