MySQL替代重复密钥更新

时间:2014-04-08 03:24:14

标签: mysql insert moodle on-duplicate-key

我试图从多个表中提取插入到表中,根据创建的类别在moodle数据库中创建角色分配,但是我需要它在重复键上更新但我无法使用在DUPLICATE KEY UPDATE上,因为我试图匹配角色ID,上下文ID和用户ID的字段不是mdl_role_assignments表中的主键。

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 :(得分: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 = '')

请注意,副本是roleid,userid和contextid的组合,但也是component和itemid的组合。因此,还需要检查component =''。