2013-07-24 5 views
2

В моей базе данных у меня есть tickets_users, которые присоединяют пользователей к билету.INSERT если значение еще не существует

Я хотел бы сделать INSERT, которая проверяет в tickets_users, если нет уже в этом users_id (например, пользователь 1444) и type = 2 WHERE tickets_id = something (например, номер билета 455); если он уже существует ничего не делать, иначе

INSERT INTO tickets_users (tickets_id, users_id, type) VALUES (455, 1444, 2) 
WHERE tickets_id = 455 
+1

Подумайте, [это] (http://stackoverflow.com/questions/5528854/usage-of-mysqls-if-exists) может быть то, что вы ищете? – vanamerongen

+0

[Заменить] (http://dev.mysql.com/doc/refman/5.0/en/replace.html)? Одно из предостережений, хотя это не то же самое, что «MERGE» в Oracle. Это либо 'INSERT', либо' DELETE 'и' INSERT'. –

+0

Tick_users.id в auto increment, и я не хочу удалять старый, если тип, match_id и user_id совпадают, просто ничего не делать, только вставляйте, если он не соответствует – Mokkun

ответ

3
INSERT INTO tickets_users (tickets_id, users_id, type) 
select 455, 1444, 2 from dual 
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = something) 

Попробуйте

Edit:
Чтобы добавить несколько строк

INSERT INTO tickets_users (tickets_id, users_id, type) 
select 455, 1444, 2 from dual 
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = 455) 
union all 
select 456, 1444, 2 from dual 
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = 456) 
+0

Спасибо, что ваш запрос работает, но как я могу использовать этот запрос для нескольких INSERT? например, с помощью SELECT 455,1444,2 WHERE tickets_id = 455, но также SELECT 425,1226,2 WHERE tickets_id = 425 и т. д. – Mokkun

+0

Вы можете использовать союз все – Akhil

+0

Не могли бы вы отредактировать свои ответы, чтобы показать мне, как запрос будет посмотрите с Union all за let say 2 билетов? – Mokkun

4

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

PRIMARY KEY 

Используйте INSERT IGNORE, а не INSERT. Если запись не дублирует существующую запись, MySQL вставляет ее как обычно. Если запись является дубликатом, ключевое слово IGNORE говорит MySQL, чтобы отменить ее без каких-либо ошибок.

INSERT IGNORE 

Для примера: идентификатор считается первичным ключом. Если запись в таблице «tablename» уже имеет запись с id = 1, тогда запрос будет просто проигнорирован, а не будет выдавать предупреждение.

Примечание: Используйте ключевое слово IGNORE только на этапе разработки. Это может привести к неожиданным результатам, поскольку вы не можете определить, была ли запись вставлена ​​или нет.

+0

просто попробовал 'INSERT IGNORE INTO ticket_users (tickets_id, users_id, type, use_notification) VALUES (1, 1444, 2, 1)' и он все еще добавляет его, я делаю что-то неправильно? – Mokkun

+0

r u добавить ключ в столбец –

+0

Я не думаю, что 'INSERT IGNORE' является рекомендуемым использованием. Он игнорирует всевозможные ошибки, хотя он должен быть пойман как неправильный формат и т. Д. [См. Это] (http://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key- обновление) – Akhil

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