Изменение номера столбца Oracle - PullRequest
2 голосов
/ 24 июня 2009

У меня есть таблица, в которой одним из столбцов является Число (22, 12), где должно быть Число (22,2). Поскольку в нем есть данные, я не могу просто изменить столбец с правильной точностью.

Какой самый эффективный способ исправить столбец?

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

Ответы [ 4 ]

5 голосов
/ 24 июня 2009
ALTER TRIGGER trfoobar DISABLE;
ALTER TABLE foobar ADD (newcol number);
UPDATE foobar SET newcol=oldcol, oldcol=null;
ALTER TABLE foobar MODIFY(oldcol number(22,2));
UPDATE foobar SET oldcol=newcol;
ALTER TABLE foobar DROP(newcol);
ALTER TRIGGER trfoobar ENABLE;
2 голосов
/ 24 июня 2009

Если вам нужно иметь таблицу во время преобразования и иметь необходимые разрешения для базы данных, вы можете использовать DBMS_REDEFINITION. Эта ссылка имеет больше информации. http://www.psoug.org/reference/dbms_redefinition.html.

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

Если вы не хотите использовать представление, вы можете создать новую таблицу, скопировать данные, удалить старую таблицу, а затем переименовать новую таблицу.

0 голосов
/ 25 июня 2009

Я всегда стараюсь избегать переименования таблиц -> создать новую таблицу -> сделать что-то для перемещения данных -> удалить старые таблицы решений, если это возможно. Всегда есть соображения о недействительности PL / SQL, воссоздании грантов, блокировок и т. Д., Которые могут усложнить это.

Если триггер не ссылается на соответствующий столбец, я бы:

  • добавить новый столбец (очевидно, с другим именем)
  • обновить таблицу, чтобы установить newColVal = oldColVal
  • опустить старый столбец
  • переименовать столбец в старое имя

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

Как указал Даниэль Э., пакет DBMS_REDEFINITION является альтернативой этому, но, по моему опыту, установка и выполнение этого требует много времени. Эту технику стоит изучить, если вам когда-либо придется вносить изменения в системы без каких-либо простоев.

0 голосов
/ 24 июня 2009

Вы можете экспортировать данные, удалить таблицу, пересоздать и импортировать или

Создайте новую таблицу с правильным определением и затем выполните:

INSERT / * + append * / INTO new_table (SELECT * FROM old_table);

удалить старую таблицу, а затем переименовать новую таблицу в старую.

ALTER TABLE new_table RENAME TO old_table;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...