Как изменить длину столбца (в символах) в Oracle 10G?

#sql #oracle #rdbms

#sql #Oracle #СУБД

Вопрос:

Я использую Oracle 10 G, я хочу уменьшить размер столбца с 30 до 20 символов. Имя таблицы — это member , столбец — это member_name , это varchar2(30) тип данных.

Мой вопрос: есть ли какой-либо запрос для этого? Если да, то что это такое?

Комментарии:

1. @OldProgrammer, ответ, который вы упомянули как дубликат, не содержит достаточных подробностей и фактически отличается от этого вопроса. (В этом вопросе OP попросил увеличить размер столбца, а в этом вопросе OP попросил уменьшить размер — для обоих сценариев требуется разное решение).

Ответ №1:

Вы можете изменить длину строк столбцов на месте. Но вы получаете сообщение об ошибке, если существующие значения слишком велики. Итак, просто сначала сократите столбец:

 update t
    set col = substr(col, 1, 20)
    where length(col) > 20;
 

Затем:

 alter table t modify x varchar2(20)
 

Вот скрипка db<>.

Я настоятельно рекомендую этот подход, поскольку он совместим с существующими ограничениями и индексами.

Ответ №2:

Вы не можете напрямую уменьшить размер VARCHAR2 столбца, если в нем есть какие-то данные.

Вам необходимо

  1. создайте новый столбец с уменьшенным размером.
  2. Заполните данные в новом столбце
  3. удалите старый столбец
  4. переименуйте новый столбец

запросы должны быть следующими:

 alter table member add member_name_new varchar2(20);
update member set member_name_new = member_name;
alter table member drop column member_name;
alter table member rename column member_name_new to member_name; 
 

Комментарии:

1. Спасибо за ваше решение. Но в строке 3 появляется ошибка «отсутствует ключевое слово», пожалуйста, проверьте ее.

2. О-о-о, я понял. Проверьте ответ прямо сейчас. alter table member drop member_name;

3. Спасибо, но, как я обнаружил ошибку, в ней отсутствовала «колонка». Это должно быть ALTER Член ТАБЛИЦЫ DROP СТОЛБЕЦ имя_элемента;

4. Вы правы. Ключевое слово Infact column также необходимо при ПЕРЕИМЕНОВАНИИ. Обновлен ответ.

5. Да! Спасибо 🙂