ИЗМЕНИТЬ таблицу в vertica

#sql #database #vertica

#sql #База данных #vertica

Вопрос:

У меня есть таблица в Vertica, которая имеет time_stamp:int со значением Unix timestamp, я хочу изменить этот тип данных с int на TIMESTAMPTZ ;

Я пытался

 ALTER TABLE exploded_names ALTER COLUMN time_stamp SET DATA TYPE TIMESTAMPTZ;
  

Но получил следующую ошибку

ОТКАТ 2353: не удается изменить тип столбца "time_stamp", поскольку на него ссылается выражение сегментации проекции "exploded_names_b0"

затем я попытался отказаться от этой проекции :

 drop projection exploded_names_b0 CASCADE;
  
ОТКАТ 4122: в таблице привязки проекции exploded_names_b0 не осталось обновленной суперпроекции
ПОДСКАЗКА: используйте УДАЛЯЕМУЮ ТАБЛИЦУ... КАСКАД для удаления таблицы привязки и ее последней проекции или создания заменяющей суперпроекции

Я не хочу удалять таблицу.

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

1. Для чего используется текущий тип данных time_stamp ?

2. Смотрите Обновление моего ответа.

Ответ №1:

Полученная вами ошибка сообщает вам, что столбец используется в выражении сегментации для проекции и, следовательно, не может быть изменен. Это ограничение для SET DATA TYPE опции. Вы можете либо создать новые суперпроекции и опустить столбец в предложении сегментации, либо создать новую таблицу и проекции с новым типом столбца.

Поскольку вы упомянули, что ваш текущий столбец является int типом, он не будет преобразован в TIMESTAMPTZ . Вот что я бы сделал:

Шаг 1 — Настройка образца данных

 CREATE TABLE public.exploded_names (
   id int,
   time_stamp int
);

INSERT INTO public.exploded_names (id, time_stamp) VALUES (1, 1403635837);

COMMIT;
  

Шаг 2 — Добавить новый столбец

 ALTER TABLE public.exploded_names ADD COLUMN iso_time TIMESTAMPTZ;
  

Шаг 3 — Создание новой суперпроекции

Мы получим существующую суперпроекцию, используя SELECT EXPORT_OBJECTS('', 'public.exploded_names');

 CREATE PROJECTION public.exploded_names /* createtype(L)*/
(
 id,
 time_stamp,
 iso_time
)
AS
 SELECT exploded_names.id,
        exploded_names.time_stamp,
        exploded_names.iso_time
 FROM public.exploded_names
 ORDER BY exploded_names.id,
          exploded_names.time_stamp
SEGMENTED BY hash(exploded_names.id, exploded_names.time_stamp) ALL NODES KSAFE 1;

SELECT MARK_DESIGN_KSAFE(1);
  

Нам нужно будет удалить time_stamp столбец и добавить iso_time предложение segmentation и изменить имя для новой суперпроекции:

 CREATE PROJECTION public.exploded_names_2
(
 id,
 time_stamp,
 iso_time
)
AS
 SELECT exploded_names.id,
        exploded_names.time_stamp,
        exploded_names.iso_time
 FROM public.exploded_names
 ORDER BY exploded_names.id,
          exploded_names.time_stamp
SEGMENTED BY hash(exploded_names.id, exploded_names.iso_time) ALL NODES KSAFE 1;

SELECT MARK_DESIGN_KSAFE(1);
  

Шаг 4 — Заполнить новый столбец

Здесь мы обновим iso_time столбец преобразованной меткой времени Unix, а затем обновим новую суперпроекцию.

 UPDATE public.exploded_names SET iso_time = TO_TIMESTAMP(time_stamp);

COMMIT;

SELECT REFRESH('public.exploded_names');
  

Шаг 5 — Удалите старую суперпроекцию

Нам нужно продвинуть маркер древней истории, а затем удалить старую суперпроекцию:

 SELECT MAKE_AHM_NOW();

DROP PROJECTION public.exploded_names;
  

Шаг 6 — Проверка проекций

Давайте убедимся, что у нас настроена правильная проекция SELECT GET_PROJECTIONS('public.exploded_names'); :

 Текущее системное K равно 1.
Количество узлов: 3.
Таблица public.exploded_names имеет 2 проекции.

Имя проекции: [Сегментированный] [Сегменты] [# друзей] [Проекции друзей] [Безопасно] [Обновление] [Статистика]
----------------------------------------------------------------------------------------------------
public.exploded_names_2_b1 [Сегментированный: Да] [Сегментированные столбцы: "public.exploded_names.id ", "public.exploded_names.iso_time"] [K: 1] [public.exploded_names_2_b0] [Безопасно: Да] [Обновление: Да] [Статистика: количество строк]
public.exploded_names_2_b0 [Сегментированный: Да] [Сегментированные столбцы: "public.exploded_names.id ", "public.exploded_names.iso_time"] [K: 1] [public.exploded_names_2_b1] [Безопасно: Да] [Дата обновления: Да] [Статистика: количество строк]

Кстати, если вы еще этого не сделали, вам следует запустить Database Designer для получения оптимизированных прогнозов.

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

1. Создание другой проекции не сделает ее суперпроекцией …. читал код любопытно, если бы вы могли / знали, как это сделать. Но я думаю, что это определяется при создании таблицы, что означает, что ваш единственный выбор здесь — удалить и создать заново.