Вот исходный запрос, который я использовал:
Код: Выделить всё
UPDATE student_records sr
JOIN enrollment_details ed ON ed.enrollment_id = sr.student_id
SET
sr.admission_date = ed.enrollment_date,
sr.admitted_by = ed.enrolled_by
WHERE
ed.enrollment_type = 'new_admission';
Я попробовал как подход на основе SQL с циклом WHILE, так и подход на основе Python с использованием pymysql. Однако в подходе SQL обновляется только первый пакет строк, а последующие пакеты не запускаются. В подходе Python скрипт выполняется без ошибок, но не обновляет записи.
Я также пробовал:
DELIMITER //
СОЗДАТЬ ПРОЦЕДУРУ UpdateStudentRecords()
НАЧАТЬ
ОБЪЯВИТЬ выполненное INT DEFAULT 0;
Код: Выделить всё
REPEAT
UPDATE student_records sr
JOIN enrollment_details ed ON ed.enrollment_id = sr.student_id
SET
sr.admission_date = ed.enrollment_date,
sr.admitted_by = ed.enrolled_by
WHERE
ed.enrollment_type = 'new_admission'
AND sr.admission_date IS NULL
LIMIT 1000;
-- Check if any rows remain to be updated
IF ROW_COUNT() = 0 THEN
SET done = 1;
END IF;
UNTIL done END REPEAT;
DELIMITER ;
CALL UpdateStudentRecords();
Я ожидаю:
- Эффективно обновить все 260 000 записей без тайм-аута или слишком длительной блокировки таблицы.
- Убедитесь, что обновления выполняются управляемыми пакетами, чтобы процесс был надежный и масштабируемый.
- Определите, почему опробованные мной подходы не работают должным образом.
Подробнее здесь: https://stackoverflow.com/questions/793 ... ch-updates
Мобильная версия