2010-07-22 3 views
3

Я разрабатываю приложение, которое должно сочетать людей. Каждый человек может соответствовать только с одним другим человеком .. Так, в приведенной ниже таблице, я пытаюсь сделать так, чтобы значения от user1 user2 & уникальны по обоим направлениям:Уникальность MySQL в нескольких полях

CREATE TABLE `match_table` (
    `user1` int(11) NOT NULL, 
    `user2` int(11) NOT NULL, 
UNIQUE KEY `user2` (`user2`), 
UNIQUE KEY `user1` (`user1`)) 

Так, например, следующий оператор INSERT следует игнорировать строки 2 и 4. Или, как минимум, мне нужно уметь отмечать те строки, которые нужно игнорировать. Обратите внимание, что строка 5 в порядке, потому что строки 2 и 4 были проигнорированы.

INSERT IGNORE INTO match_table (user1, user2) 
VALUES 
    (1,2), 
    (2,3), 
    (4,5), 
    (6,4), 
    (3,6) 

Есть ли какой-либо индекс, который может это сделать? .. В противном случае есть некоторые ОБНОВЛЕНИЯ, которые я мог бы сделать после вставки, которые могли бы отмечать те, которые я хочу игнорировать?

ответ

3

Предполагая, что согласование не имеет направления, вы можете использовать свой существующий дизайн таблицы, но сохранить матч оба пути в таблице:

INSERT IGNORE INTO match_table (user1, user2) 
VALUES 
(1,2), 
(2,1), 
(2,3), 
(3,2), 
(4,5), 
(5,4), 
(6,4), 
(4,6), 
(3,6), 
(6,3) 

Если вы просто извлечь все строки вы получили каждое соответствие дважды. Вы можете избежать этого следующим образом:

SELECT * FROM match_table WHERE user1 < user2 
1, 2 
3, 6 
4, 5 

Один потенциальный вопрос с этой конструкции является то, что можно вставить строку с пользователем, который соответствует самому.

+0

Mark .. Спасибо .. Вы гений. Ответ довольно прост!! – Jesse

+0

Я бы проголосовал за вас, но у меня только 1 репутация :( – Jesse

+0

@Jesse: Я и кто-то еще поддержал ваш вопрос, так что у вас теперь есть репутация 11. Вам нужно только еще одно upvote ... :) –

0

Если вы только просить ограничения базы данных, вы можете получить, что с UNIQUE INDEX («user1», «user2»)

Смежные вопросы