diff --git a/public/enrol/database/db/upgrade.php b/public/enrol/database/db/upgrade.php index e6af6646b6b..755d5bd7f53 100644 --- a/public/enrol/database/db/upgrade.php +++ b/public/enrol/database/db/upgrade.php @@ -58,15 +58,19 @@ function xmldb_enrol_database_upgrade($oldversion) { // Migrate enrolments where possible. // First, get the user enrolments that can be migrated. + // Only select the earliest (MIN id) user_enrolments per user to avoid + // duplicate key violations when a user has multiple enrolments across + // duplicate database enrol instances. $migrateusers = $DB->get_records_sql( - "SELECT ue.id + "SELECT MIN(ue.id) AS id FROM {user_enrolments} ue WHERE ue.enrolid $insql AND NOT EXISTS ( SELECT 1 FROM {user_enrolments} ue2 WHERE ue2.userid = ue.userid - AND ue2.enrolid = :idtokeep)", + AND ue2.enrolid = :idtokeep) + GROUP BY ue.userid", array_merge($inparams, ['idtokeep' => $idtokeep]), );