2012-02-08 6 views
0

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

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

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

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

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

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

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

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

+0

Что это за база данных? MySQL? –

ответ

3

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

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

0

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

+0

Он хочет, чтобы каждый столбец мог иметь несколько записей, если две строки обоих столбцов не совпадают.Поэтому наличие (субъект, класс) (1,2) (1,3) (2,4) в порядке, но с (1,2) дважды нет. – Tim

+0

@Tim, и именно поэтому есть * один * уникальный ключ, применяемый к двум столбцам. –

+0

Извините, неверно. Думали, вы имели в виду, что каждый столбец должен быть уникальным. – Tim

-1

Добавить UNIQUE в обоих полях.

ALTER TABLE `table` ADD UNIQUE ( `subject_id` , `class_id`) ; 
+0

Это ничего не изменит по уникальности! –

0

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

ALTER TABLE subject_class ADD UNIQUE INDEX sanity (subject_id, class_id); 
0

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

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

alter table subject_class ADD UNIQUE INDEX sanity (subject_id, class_id); 
+0

Это также не обрабатывает синхронный запрос, по крайней мере, не так легко. –

+0

см. Обновленный ответ. –

0

Создание первичного ключа через два поля

ALTER TABLE subject_class ADD PRIMARY KEY (subject_id, class_id) 

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

Смежные вопросы