Первичный ключ с двумя столбцами в MySQL

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

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

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

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
5
0
5 272
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

Например:

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

См. MySQL Создать указатель руководства.

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

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

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

Другие вопросы по теме