2014-11-22 51 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