2014-04-08 138 views
0

我試圖從多個表中拉入插入到表中創建基於創建的類別在moodle的數據庫中的角色分配,但我需要它在重複密鑰更新,但我不能使用ON DUPLICATE KEY UPDATE,因爲im試圖在角色ID,上下文ID和用戶ID上匹配的字段不是mdl_role_assignments表中的主鍵。MySQL替代重複鍵更新

insert into vclassmoodle.mdl_role_assignments (roleid,contextid,userid,timemodified,modifierid,itemid,sortorder) select 
mdl_role.id as roleid, mdl_context.id as contextid, mdl_user.id as userid, unix_timestamp() as timemodified, 3 as modifierid, 0 as itemid, 0 as sortorder 
from 
mdl_context 
    left join 
mdl_course_categories ON mdl_context.instanceid = mdl_course_categories.id 
    left join 
mdl_user ON mdl_course_categories.idnumber = mdl_user.idnumber 
    join 
mdl_role ON mdl_role.shortname = 'manager' 
where mdl_context.contextlevel = 40 and mdl_course_categories.depth > 1 

讓我知道,如果我需要澄清什麼

感謝

+1

這些字段不需要是主鍵 - 只需將它們標記爲唯一。 –

+0

他們不能被標記爲唯一的,因爲他們不是,用戶可以在同一個contextid或不同的contextids上爲不同的權限分配多個角色。需要插入和更新的權限即爲他們的類別(contextid)上的經理。如果我亂搞moodle表,它可能會在moodle中造成重大問題。 – MightyElectro

+0

大概有些東西是獨一無二的,或者你不知道要更新哪一行。我猜想一個複合唯一索引可能會做你所需要的,但是如果你不想改變這個模式,那麼你就沒有選擇,只能從表中首先選擇'SELECT'並且'INSERT'或'UPDATE'根據結果​​。注意競爭條件 - 您可能需要使用這些更新的事務。 –

回答

0

就一直有在/lib/accesslib.php看看功能role_assign()

如果有是重複的,它不更新,所以你可以忽略重複。

儘管您應該真正使用role_assign()函數,而不是直接插入數據。在將來角色分配發生變化的情況下,還因爲它觸發了可能在其他地方使用的role_assigned事件。

還在用你的查詢,但忽略現有記錄,並創建一個循環來調用role_assign(),像這樣

SELECT mdl_role.id as roleid, 
     mdl_context.id as contextid, 
     mdl_user.id as userid 
FROM mdl_context 
JOIN mdl_course_categories ON mdl_context.instanceid = mdl_course_categories.id 
JOIN mdl_user ON mdl_course_categories.idnumber = mdl_user.idnumber 
JOIN mdl_role ON mdl_role.shortname = 'manager' 
WHERE mdl_context.contextlevel = 40 
AND mdl_course_categories.depth > 1 
AND NOT EXISTS (
    SELECT mdl_role_assignments.id 
    FROM mdl_role_assignments 
    WHERE mdl_role_assignments.roleid = mdl_role.id 
    AND mdl_role_assignments.contextid = mdl_context.id 
    AND mdl_role_assignments.userid = mdl_user.id 
    AND mdl_role_assignments.itemid = 0 
    AND mdl_role_assignments.component = '') 

注意,重複的角色ID,用戶名和關聯標識符,而且分量和itemid的組合。所以component =''也需要檢查。