#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. Создание другой проекции не сделает ее суперпроекцией …. читал код любопытно, если бы вы могли / знали, как это сделать. Но я думаю, что это определяется при создании таблицы, что означает, что ваш единственный выбор здесь — удалить и создать заново.