Предотвратить повторяющиеся строки со всеми неуникальными столбцами (только с MySQL)? - PullRequest
3 голосов
/ 03 июня 2010

Как предотвратить создание дублирующейся строки в таблице с двумя столбцами, ни один из которых не является уникальным? И может ли это быть сделано только с использованием MySQL, или это требует проверки с помощью моего PHP-скрипта?

Вот запрос CREATE для рассматриваемой таблицы (существуют две другие таблицы, users и roles):

CREATE TABLE users_roles (
user_id INT(100) NOT NULL,
role_id INT(100) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (role_id) REFERENCES roles(role_id)
) ENGINE = INNODB;

Я бы хотел, чтобы следующий запрос, если он выполнялся более одного раза, выдавал ошибку:

INSERT INTO users_roles (user_id, role_id) VALUES (1, 2);

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

Спасибо!

Ответы [ 3 ]

5 голосов
/ 03 июня 2010

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

ALTER TABLE users_roles ADD CONSTRAINT UNIQUE (user_id, role_id);
4 голосов
/ 03 июня 2010

Определите столбцы user_id и role_id в качестве первичного ключа для таблицы.

CREATE TABLE users_roles (
  user_id INT(100) NOT NULL,
  role_id INT(100) NOT NULL,
  PRIMARY KEY(user_id, role_id)
  FOREIGN KEY (user_id) REFERENCES users(user_id),
  FOREIGN KEY (role_id) REFERENCES roles(role_id)
) ENGINE = INNODB;

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

Если первичный ключ уже определен, вам нужно использовать уникальные ограничения / индексы.

0 голосов
/ 03 июня 2010

Однажды в колледже профессор БД сказал мне: «У каждой таблицы должен быть первичный ключ»

ALTER TABLE users_roles ADD PRIMARY KEY (user_id, role_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...