Как создать уникальный индекс MySql

Рейтинг: 0Ответов: 1Опубликовано: 15.04.2015

Таблица Values: id(prim key), user1(int), user2(int), value(float)

Создал индекс unique для user1(int), user2(int). Но он работает не так как я хотел.

Нужно избежать дубликатов в столбцах user1 и user2.

user1 = 1 user2 = 2
user1 = 1 user2 = 3

Тут все ок. При добалении:

user1 = 1 user2 = 2 - ошибка. Тут тоже все ок.

Но! при добалении:

user1 = 2 user2 = 1 - ошибки нет! 

MySql добавляет запись. Но для меня это дубликат! так как эта пара пользователей уже есть!

Как создать такой уникальный индекс? Создавать еще столбик с хешем md5(min(id)+max(id)) ? и делать по нему индекс?

Обновление

CREATE TABLE `guillaume777_profile_matches` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `profile_id` int(10) NOT NULL,
  `match_profile_id` int(10) NOT NULL,
  `skills_match` float(10,0) NOT NULL DEFAULT '0',
  `personality_match` float(10,0) NOT NULL DEFAULT '0',
  `global_match` float(10,0) NOT NULL DEFAULT '0',
  `gen_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `Profiles_Index` (`profile_id`,`match_profile_id`) USING HASH,
  KEY `GlobalMatchIndex` (`global_match`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

Ответы

▲ 2Принят

Хорошая идея про хэш, только как Вы написали работать не будет (1+4 = 3+2). Лучше md5(min($ids) . '|' . max($ids)) - это на php. Хэш из конкатенации минимального, какого-то нечислового разделителя и максимального.

В принципе, даже не обязательно хэш. Можно просто строку хранить.

Можно сделать триггер. Например, так

CREATE TRIGGER `insert_user_pair_hash` 
BEFORE INSERT ON `table_name` 
FOR EACH ROW SET NEW.hash_column = CONCAT_WS( '|',  LEAST(NEW.user1, NEW.user2), GREATEST(NEW.user1, NEW.user2))

На update то же самое, только вместо BEFORE INSERT, BEFORE UPDATE