2015-01-03 2 views
1

Это не так просто, как написано в названии.MySQL: уникальные данные для 2 полей

У меня есть таблица для связывания учетных записей пользователей.

Например: человек подписывается через стандартную функциональность сайта. На следующий день он регистрируется через учетную запись Facebook.

У меня user_user стол с a_user_id, b_user_id полей. Эти поля являются внешними ключами к стандартной пользовательской таблице. Я делаю уникальный ключ для 2 полей.

Но. Как избежать ситуации, как этот:

a_user_id: 1 
b_user_id : 2 

и следующую строку:

a_user_id: 2 
b_user_id : 1 

Обе строки означают то же самое. Может ли MySQL справиться с этим? Есть ли какие-нибудь лучшие подходы для этого случая?

+0

Это довольно легко в других СУБД, но я не думаю, что вы можете эффективно e это на уровне базы данных с MySQL. –

ответ

0

Введите ограничение a_user_id < b_user_id. Честно говоря, я до сих пор всегда придерживался этого ограничения на стороне программирования. Это предотвращает циклы: self-ссылки и a-b-a.

Первым нужно будет нормализовать таблицу, возможно, используя временную таблицу в MySQL.


Нормализация старой таблицы:

Предполагая таблицу u2(a_user_id NOT NULL, b_user_id NOT NULL):

DELETE FROM u2 
WHERE a_user_id = b_user_id; 

ALTER TABLE u2 ADD COLUMN other ...; 

UPDATE u2 
SET 
    other = a_user_id, 
    a_user_id = b_user_id, 
    b_user_id = other 
WHERE 
    a_user_id > b_user_id; 

ALTER TABLE u2 REMOVE COLUMN other; 

(Переполнение синтаксис)

+0

Вы не можете создать такое ограничение в MySQL (оно не поддерживает ограничение проверки), единственный способ обеспечить это с ограниченными возможностями MySQL - написать триггер. –

+0

Большое спасибо за очень интересный aproach. Не могли бы вы привести пример кода изменения таблицы? Да, я считаю, что это лучше делать на стороне приложения, все еще ищу лучшего способа управления одним местом. –

+0

@a_horse_with_no_name да, хотя я бы предпочел, чтобы хранимая процедура вставлялась, связывали два идентификатора пользователя. –

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