Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > MySQL > Уникальная комбинация полей |
Автор: Ripper 18.12.2011, 13:07 |
Здравствуйте. У меня есть таблица предложений контрактов, где есть такие поля: ID, proposer, target, contract_type, date. Как грамотнее написать запрос на добавление строки в таблицу, чтобы пара proposer, target оказалась уникальной? Т.е. если такие два значения уже существуют, то не добавлять запись? На ум приходит написать что-то вроде insert into contract_suggestion (proposer, target, contract_type, date) values (...) where not exists (select * from contract_suggestion where (proposer={$proposer} and target={$target}) или как-то так. А, и еще пара должна быть уникальна с обоих сторон, т.е. не должно быть скажем двух пар: 2,5 и 5,2. Но я думаю есть более хорошее решение. Спасибо заранее. |
Автор: Zloxa 18.12.2011, 17:52 |
Добавить ограничение уникальности (unique constraint) по паре (proposer, target). Другие способы обеспечения уникальности - от лукавого. |
Автор: Ripper 19.12.2011, 02:10 |
Да, а вот если в случае что пара должна быть уникальна в обоих комбинациях? Например если есть 5,3 то 3,5 уже не должно быть? В интернете нашел пример с триггером, вроде помогло) |
Автор: Akina 19.12.2011, 08:04 |
Ввести constraint на уникальность CONCAT(MIN(proposer, target), MAX(proposer, target)) |
Автор: Zloxa 19.12.2011, 08:47 |
Akina, маська умеет строить ключи по функции? ![]() Крайне рекомендую внимательно протестировать работу этого триггера в многопользовательском режиме, в разных режимах изоляции транзакций. ![]() |
Автор: Akina 19.12.2011, 09:10 | ||||
Нет. Но, как всегда, есть путь через задний проход... Вводится доп. поле. На него накладывается ограничение уникальности. Поле напрямую нигде не используется, заполняется или изменяется в триггере. При нарушении уникальности срабатывает ограничение, и отваливается весь запрос.
В примере val2 - как раз такое поле, заполняемое из триггера неявно. Наложите на него UNIQUE - и при дублировании вставка строк обломится.
Аналогично создаётся и триггер before update. Поскольку мы работаем исключительно с таблицей NEW - нам не страшны никакие многопользовательские заморочки. Или, вернее, так - мы не получим никаких ДОПОЛНИТЕЛЬНЫХ граблей. |
Автор: Akina 19.12.2011, 10:20 | ||
Я знаю. |