ALTER TABLE "student_groups" ADD COLUMN "course_id" UUID; CREATE INDEX "student_groups_course_id_idx" ON "student_groups"("course_id"); ALTER TABLE "student_groups" ADD CONSTRAINT "student_groups_course_id_fkey" FOREIGN KEY ("course_id") REFERENCES "courses"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- Preserve only unambiguous historical course associations. Empty groups without -- curriculum history cannot be attributed to an instructor safely. WITH candidates AS ( SELECT "group_id", "course_id" FROM "instructor_curriculum_settings" WHERE "group_id" IS NOT NULL UNION SELECT m."group_id", e."course_id" FROM "student_group_members" m JOIN "student_enrollments" e ON e."user_id" = m."user_id" AND e."status" = 'ACTIVE' ), unique_courses AS ( SELECT "group_id", MIN("course_id"::text)::uuid AS "course_id" FROM candidates GROUP BY "group_id" HAVING COUNT(DISTINCT "course_id") = 1 ) UPDATE "student_groups" g SET "course_id" = c."course_id" FROM unique_courses c WHERE g."id" = c."group_id";