2014-11-22 3 views
0

Я не знаю, как сформулировать соответствующий заголовок для этого. Проблема заключается в следующем. Менеджер групп может добавлять события в группы на моем веб-сайте, когда добавляется событие, члены группы, которые выбрали так, должны быть автоматически добавлены к событию в качестве участников. Проблема в том, что некоторые пользователи, возможно, уже выбрали, что они посещают событие до его добавления в группу, поэтому их запись будет существовать в таблице с участниками, и я получу ошибку Duplicate entry на моем триггере.MySQL несколько строк вставки пропустить существующие записи

Я хочу спросить, как по-прежнему иметь первичный ключ на 2 колонки - т.е. не допускать тот же пользователь должен быть вставлен в events_attendees с тем же event_id, но все-таки вставить остальные строки в случае многоэтажного вставки?

таблица групп

group_id | group_name ...

таблица пользователей

user_id | user_name ...

таблица событий

event_id | event_name ...

стол groups_members

group_id | user_id | autoJoinEvents

столик groups_events

group_id | event_id

столик events_attendees`

event_id | user_id

Триггер в вопросе находится на groups_events на AFTER INSERT

INSERT INTO events_attendees (event_id, user_id) 
    SELECT NEW.event_id, user_id 
    FROM groups_members 
    WHERE group_id = NEW.group_id AND autoJoinEvents = 1 

ответ

2

Вы не указали структуру таблицы, поэтому я не могу определить, действительно ли ваши индексы обеспечивают уникальность. После того, как вы получите, что покрыты, это с уверенностью предположить, что вы могли бы использовать ON DUPLICATE KEY

INSERT INTO events_attendees (event_id, user_id) 
SELECT NEW.event_id, 
      user_id 
FROM groups_members 
WHERE group_id = NEW.group_id 
AND autoJoinEvents = 1 
ON DUPLICATE KEY UPDATE event_id=NEW.event_id 

Edit: Это решение, которое вы добавили себя

INSERT IGNORE INTO events_attendees (event_id, user_id) 
SELECT NEW.event_id, 
      user_id 
FROM groups_members 
WHERE group_id = NEW.group_id 
AND autoJoinEvents = 1 

Оба способа работают. Разница заключается в том, что вторая одна будет игнорировать любые ошибки, в то время как первый из них будет только обойти конкретный дубликат ключа вопрос

+0

Да, я полагаю, что именно магия мне нужно, но Я получаю код проверки blah blah, который соответствует blah blah рядом с «IGNORE» –

+0

Синтаксис для этого был 'INSERT IGNORE ...' Я позволил вам отредактировать ваш ответ. Благодаря! –

+0

Спасибо, я вроде как смешанные два возможных способа сделать это. В INSERT IGNORE есть небольшая оговорка, но для вашего случая использования она должна работать нормально. – amenadiel

1

вы можете попробовать

ALTER IGNORE TABLE events_attendees DROP PRIMARY KEY, ADD PRIMARY KEY(event_id,user_id); 
+0

Это то, что у меня есть –

+0

уверены, что таблица events_attendees содержит составной первичный ключ? –

+0

Да, все мои индексы верны во всех таблицах. (правильное отношение к здравому смыслу) –

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