Teradata: Как добавить столбец идентификаторов в существующую таблицу? - PullRequest
1 голос
/ 23 декабря 2011

Мне нужно добавить столбец идентификаторов в существующую таблицу с этим SQL:

alter table app.employee 
add ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1 INCREMENT BY 1 MINVALUE 0 MAXVALUE 100000000 NO CYCLE)

Я могу просто создать новые таблицы со столбцом идентификаторов, но приведенный выше скрипт выдаст мне следующую ошибку:

ALTER TABLE Failed. 3706: Syntaxt error: Cannot add new Identity Column option

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

Какие у меня есть варианты?

1 Ответ

3 голосов
/ 24 декабря 2011

Существуют сетевые ресурсы для Teradata, такие как SO, администраторы баз данных (Stack Exhcange) и Teradata Developer Exchange. Это, вероятно, ваши лучшие источники информации.

Страница 43 из Teradata Язык определения данных SQL - Подробные темы Руководство для Teradata 13.10 гласит:

Вы не можете добавить столбец идентификаторов в существующую базовую таблицу, а также не можете Вы добавляете атрибут столбца идентификации в существующий столбец.

Это может показаться утомительным, но этот подход работает очень хорошо и сводит к минимуму время простоя данных для конечных пользователей. Он хорошо работает и является предпочтительным методом, который мы используем при внесении изменений в модель данных для таблиц с миллиардами строк. Вставка данных в новую таблицу должна быть достаточно хорошо оптимизирована, поскольку оптимизатор Teradata должен выбирать операцию MERGE на уровне блоков данных вместо строки за строкой.

  1. Создание новой таблицы с помощью столбца идентификаторов
  2. Убедитесь, что изменения целевой таблицы в исходной таблице сохранены.
  3. Вставить Выбрать данные из старой таблицы в новую таблицу.
  4. Переименуйте {orig_table} в {orig_table} _old.
  5. Переименуйте {new_table} в {orig_table}.
  6. Проверка данных новой таблицы и удаление {orig_table} _old
  7. Обновить представление представления 1: 1 для представления столбца идентификаторов. (Необязательно)

Надеюсь, это поможет.

Еще одно решение, которое вы можете попробовать, если вам нужно расширить тип данных столбца, который находится за пределами допустимой модификации на месте. (например, DECIMAL (3,0) -> DECIMAL (5,0)):

ALTER TABLE {MyTable} ADD {Orig_ColumnName}_New DECIMAL(5,0) NULL;
UPDATE {MyTable} SET {Orig_ColumnName}_New = {Orig_Column};
ALTER TABLE {MyTable} DROP {Orig_ColumnName};
ALTER TABLE {MyTable} RENAME {Orig_ColumnName}_New AS {Orig_ColumnName};
ALTER TABLE {MyTable} ADD {Orig_ColumnName} NOT NULL; /* If original column was NOT NULL */

Правила, объясняющие границы для расширения типа данных столбцов, можно найти в руководстве Teradata DDL.

...