У меня есть база данных с большим количеством клиентов, и есть вероятность, что номер клиента (NUMBER(10)
) собирается выйти за пределы.
Из-за других устаревших систем я ничего не могу сделать с этим ключом. Решение состоит в том, чтобы добавить еще один столбец, который позже будет использоваться в качестве new
ссылки на клиента.
В любом случае, есть ли способ скопировать все значения из старого столбца в новый столбец без простоя?
Если я запускаю этот SQL, таблица блокируется (ввод / вывод) в течение 2-3 минут (недопустимо)
UPDATE table SET new_customer_ref = old_customer_number;
РЕДАКТИРОВАТЬ: Спасибо, ребята за помощь. Я закончил тем, что использовал решение, предоставленное @ Simulant
Вот что я сделал:
-- Copy all old numbers to new reference in batches of 5000
DECLARE
i NUMBER := 1;
batchsize NUMBER := 5000;
maxId NUMBER;
BEGIN
SELECT MAX(ID) INTO maxId FROM CUSTOMER;
EXCEPTION
WHEN no_data_found THEN maxId := 0; /* Prevent endless loop if no customers. */
LOOP
UPDATE CUSTOMER SET new_ref = old_number WHERE ID >= i AND ID < i + batchSize;
i := i + batchSize;
COMMIT;
EXIT WHEN i>maxId ;
END LOOP;
END;
/