Когда недостаточно ALTER TABLE
Когда недостаточно ALTER TABLE
Иногда бывает нужным произвести изменение столбца, которое нельзя совершить с помощью ALTER TABLE. Примером может быть случай, когда столбец, хранящий международные элементы языка, имеет набор символов NONE, который нужно заменить на другой набор символов, чтобы исправить ошибку проектирования, или телефонный номер, определенный вначале кем-то как целое, нужно заменить на 18-символьный столбец.
В первом случае невозможно изменить набор символов для столбца, следовательно, вам нужно средство, чтобы сохранить данные и сделать их доступными в правильном наборе символов. Во втором случае простое изменение типа данных столбца с телефонным номером не будет работать, если у нас уже существуют целые числа в этом столбце. Мы хотим сохранить существующие числа, но нам нужно преобразовать их в строки. Это не может быть выполнено в существующей структуре, потому что столбец с целым типом данных не может хранить строки.
Прием заключается в создании в таблице временного столбца с правильными атрибутами и переносе туда данных, после чего вы удалите и пересоздадите нужный столбец.
1. Добавьте в таблицу временный столбец с теми атрибутами, которые вам нужны.
ALTER TABLE PERSONNEL
ADD TEMP_COL VARCHAR (18) ;
COMMIT;
2. Скопируйте данные из столбца, который вы будете изменять, во временный столбец, преобразовывая их соответствующим образом (например, изменяя набор символов для конвертирования текстовых данных в правильный набор символов или, как в нашем примере, выполняя преобразование).
UPDATE PERSONNEL
SET TEMP_COL = CAST(TEL_NUMBER AS VARCHAR(18))
WHERE TEL_NUMBER IS NOT NULL;
COMMIT;
3. После проверки того, что данные во временном столбце были изменены, как планировалось, удалите старый столбец.
ALTER TABLE PERSONNEL DROP TEL_NUMBER;
4. Создайте "новый" столбец, с тем же именем, как и тот, который вы только что удалили, и с теми же атрибутами, что и у временного столбца.
ALTER TABLE PERSONNEL
ADD TEL_NUMBER VARCHAR (18);
5. Скопируйте данные во вновь созданный столбец.
UPDATE PERSONNEL
SET TEL_NOMBER = TEMP_COL WHERE TEMP_COL IS NOT NULL;
COMMIT;
6. После проверки того, что данные во вновь созданном столбце правильные, удалите временный столбец. Если хотите, вы можете также переместить пересозданный столбец на его старую позицию.
ALTER TABLE PERSONNEL
DROP COLUMN TEMP_COL,
ALTER TEL_NUMBER POSITION 6;
COMMIT;