2015-10-08 3 views
2

У меня есть следующие таблицыMySQL дружбы схемы

create table users 
(
    id_user int(9) AUTO_INCREMENT primary key, 
    email varchar(64) 
); 

create table friendships 
(
    id_friendship int(9) AUTO_INCREMENT primary key, 
    id_friend1 int(9), 
    id_friend2 int(9), 
    FOREIGN KEY (id_friend1) REFERENCES users(id_user), 
    FOREIGN KEY (id_friend2) REFERENCES users(id_user), 
    UNIQUE(id_friend1,id_friend2) 
) 

Я хочу избежать иметь такую ​​же дружбу между двумя пользователями дважды. Но я все еще могу вставить ту же дружбу дважды, как это:

INSERT INTO friendships(id_friend1, id_friend2) VALUES (1,2) 
INSERT INTO friendships(id_friend1, id_friend2) VALUES (2,1) 

Мне (1,2) и (2,1) равны, и я хочу, чтобы избежать этого. Как я могу это достичь?

+0

Я бы отказался от логики. Когда вы вставляете один, ВСЕГДА вставьте другой. У вас есть маленький флаг, обозначающий «истинный». – Strawberry

ответ

3

Вы можете написать эти идентификаторы в определенном порядке. Например, перед вставкой попробуйте убедиться, что меньший id переходит в левый столбец, а другой - в другой столбец.

В вашем примере будет всегда:

INSERT INTO friendships(id_friend1, id_friend2) VALUES (1,2) 

и никогда что-то вроде:

INSERT INTO friendships(id_friend1, id_friend2) VALUES (2,1) 

С идентификатором 2 больше, чем идентификатор 1.

Надеется, что это помогает!

+1

Не уверен, что это законно, но, может быть, вы могли бы расширить эту мысль до чего-то вроде «INSERT INTO» (id_friend1, id_friend2). ЦЕННОСТИ (МЕНЬШЕ (a, b), БОЛЬШИЕ (a, b)) '? – danneth

+0

Это игнорирует концепцию взаимности - то есть кто инициировал и кто ответил взаимностью - что может быть важно. – Strawberry

0

К сожалению, MySql по-прежнему не поддерживает ограничение проверки, поэтому вам необходимо принудительно применить это ограничение в своей бизнес-логике. Если вы хотите вставить (1,2), просто проверьте, существует ли (2,1), запустив простой оператор select.

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