Middle — Middle+
How can you update or correct a large amount of data in a database using a script without risking its loss or inaccessibility?
sobes.tech AI
Answer from AI
To update a large volume of data in a database through a script without risking data loss or unavailability, it is advisable to use approaches that minimize load and ensure atomicity:
- Transactions: Wrap updates in transactions so that changes are either fully applied or not applied at all.
- Batch processing: Divide updates into small batches (e.g., 1000 records) to avoid long table locks.
- Use of indexes: Ensure that WHERE conditions use indexes to speed up selection before updating.
- Backup: Make a backup of the database before running the script.
- Lock modes: Use transaction isolation levels suitable for your DBMS to avoid locking issues.
- Logging and rollback: The script should correctly rollback changes in case of an error.
Example in PHP with PDO and batch processing:
$pdo->beginTransaction();
try {
$batchSize = 1000;
$offset = 0;
do {
$stmt = $pdo->prepare('SELECT id FROM table LIMIT :limit OFFSET :offset');
$stmt->bindValue(':limit', $batchSize, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$ids = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (!$ids) break;
$updateStmt = $pdo->prepare('UPDATE table SET column = :value WHERE id = :id');
foreach ($ids as $id) {
$updateStmt->execute([':value' => 'new_value', ':id' => $id]);
}
$offset += $batchSize;
} while (count($ids) === $batchSize);
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
This approach allows controlling the load and guarantees data integrity.