2014-11-22 54 views
0

我不知道如何为此制定合适的标题。问题如下 - 团队经理可以将事件添加到我的网站中的组中,当添加事件时,已选择该组的成员需要作为与会者自动添加到事件中。问题在于,有些用户可能已经选择他们参加该活动,然后才将其添加到该组中,以便他们的记录与参与者一起存在表中,并且我的触发器上会出现Duplicate entry错误。MySQL多行插入跳过现有记录

我想问一下如何在2列上仍然有一个主键 - 即不允许同一用户插入events_attendeesevent_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_eventsAFTER 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 

编辑:这是你自己添加

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检查代码对应于'IGNORE''旁边的blah blah – 2014-11-22 16:32:20

+0

语法是'INSERT IGNORE ...'我冒昧地编辑你的答案。谢谢! – 2014-11-22 16:55:26

+0

谢谢,我有种混合两种可能的方式来做到这一点。 INSERT IGNORE有一个小小的警告,但对于你的用例,它应该可以正常工作。 – amenadiel 2014-11-22 17:27:03

1

你可以尝试

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

这就是我所知道的 – 2014-11-22 16:30:09

+0

肯定events_attendees表包含复合主键? – 2014-11-22 16:34:02

+0

是的,我的所有索引在所有表格中都是正确的。 (正确的关于常识) – 2014-11-22 16:35:11