2015-04-05 2 views
1

У меня есть таблица друзей, в которой есть поля «id», «friend (INTEGER)» и «user (INTEGER)».избегать дублирования в mysql insert

Дружеская связь существует между пользователем и другом. т.е.

id  user  friend 

6  22  45 

7  45  22 

тот же друг отношения и должны рассматриваться как дубликат записи.

Я хочу, чтобы ввести целую много записей сразу, так что-то вроде:

INSERT INTO friends (user, friend) VALUES(22, 34), (22, 76), (22, 567)...; 

В этой ситуации, я могу легко использовать ПРОИГНОРИРУЙТЕ, чтобы не вводить дубликат (22, 34), вход (если (22, 34) уже существует), но есть ли способ, которым я также могу избежать ввода (22, 34), если (34, 22) уже существует, так как это то же самое отношение.

+1

Самый простой способ: Всегда сортируйте свои пары отношений перед вставкой: '(22,45) -> (22,45); (45,22) -> (22,45); 'и сохраняйте уникальное ограничение ключа для обоих столбцов. – dognose

+0

@satishrajak вы не читали вопрос, не так ли? – dognose

+0

Вы можете добавить триггер до вставки, чтобы проверить столбец друзей для ключа и прервать вставку, если отношение уже существует. Однако, как вы хотите настроить этот код, я могу назвать вас своим другом, и вы можете не согласиться. Таким образом, ваша вторая вставка (45,22) является скорее подтверждением этой дружбы, которую вы просто хотите пропустить. –

ответ

1

Отсортировать каждую пару; затем сделайте INSERT IGNORE, чтобы избежать сообщений об ошибках.

Вы можете отсортировать, как вы вставите делая

INSERT IGNORE INTO tbl (a,b) VALUES (LEAST($a, $b), GREATEST($a, $b)); 

Однако для того, чтобы сделать пакетное вставку, вы должны, вероятно, своего рода на языке клиента.

Еще одна проблема: INSERT IGNORE создаст id, прежде чем он проверяет дубликат. Поэтому количество AUTO_INCREMENT значений будет «сожжено».

Вместо того, чтобы объяснять, как избежать горения, я скажу, что, по-видимому, нет веской причины для id. Вместо того, чтобы иметь

PRIMARY KEY(user_id, friend_id) 

Другая проблема с сортировкой ... SELECT, возможно, потребуется сделать UNION:

(SELECT ... WHERE user_id = $x) 
UNION ALL 
(SELECT ... WHERE friend_id = $x) 

Это означает, что вам это нужно, тоже:

INDEX(friend_id, user_id) 
Смежные вопросы