SQL - копировать один столбец в другой - PullRequest
0 голосов
/ 29 октября 2018

У меня есть база данных с большим количеством клиентов, и есть вероятность, что номер клиента (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;
/

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Вы можете написать скрипт (на любом языке по вашему выбору), который сможет подключаться к вашей базе данных и обновлять значения частями по 100-1000 строк. Таким образом, у вас есть несколько транзакций с более коротким временем выполнения каждой.

Поскольку миграция теперь асинхронная, вы должны обработать в коде своего приложения, что новый столбец может быть нулевым, в то время как значение не было перенесено. В этом случае положитесь на старое значение, а также обновите новое значение, когда оно было изменено. Если новое значение уже присутствует, вам не нужна специальная обработка. Вы можете удалить эту резервную обработку после завершения полной миграции.

0 голосов
/ 29 октября 2018

Я думаю, что в таком случае COMPUTED COLUMN очень полезно, если вам разрешено изменять структуру таблицы и таким образом вам не нужно обновлять записи в любое время

ALTER TABLE TABLE_NAME ADD [new_customer_ref] AS [old_customer_number]
0 голосов
/ 29 октября 2018

Вы можете изменить существующий столбец вместо создания нового столбца.

ALTER TABLE Table_name MODIFY customer NUMBER(50);  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...