Первичный ключ с двумя столбцами в MySQL - PullRequest
5 голосов
/ 05 декабря 2008

У меня очень простая проблема и решение, которое будет работать, но я ищу более простую.

Я бы хотел запретить добавление строк в базу данных, когда несколько значений равны существующим значениям. Например, если a2 = a1 и b2 = b1, данные отклоняются. Если только a2 = a1 или только b2 = b1, это разрешено. По сути, я хочу, чтобы он действовал как первичный ключ, для которого требуются оба значения.

Я знаю, что могу сделать это путем проверки, прежде чем писать в базу данных - напр. выберите *, где a = 'a2' и b = 'b2', а затем избегайте записи новых данных при получении результатов. Я бы предпочел включить настройку MySQL, такую ​​как первичный ключ, которая автоматически блокирует такие данные.

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

Ответы [ 3 ]

10 голосов
/ 05 декабря 2008

Создайте уникальный индекс для столбцов, которые вы хотите быть уникальными.

Например:

CREATE UNIQUE INDEX index_name ON table(col1, col2);

См. Руководство по созданию индекса MySQL .

0 голосов
/ 05 декабря 2008

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

  • Пользователь не должен проверять, существует ли значение больше. Они просто пытаются выполнить операцию, и если она не выполняется, это означает, что значение уже существует. Это немного снижает нагрузку на вашу базу данных и упрощает логику приложения.
  • База данных всегда будет действительной, поскольку она сама применяет правила. Работать с базой данных намного проще, когда вы можете рассуждать о жестких правилах, а не о том, что «мы ожидаем, что дубликатов не будет, но это технически возможно ...»
0 голосов
/ 05 декабря 2008

Вы хотите использовать синтаксис MySQL CONSTRAINT при создании таблицы (или изменить существующую таблицу).

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