2011-12-23 3 views
1

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

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 сильно отсутствует в онлайн-поддержке, и я нахожу только один вариант, который заключается в том, чтобы в основном создать копию таблицы с столбцом идентификации и сделать массовую вставку из старой таблицы в новую и изменить все ссылки на новую таблицу. Мне трудно поверить, что это единственный возможный способ сделать это.

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

ответ

3

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

Page 43 Teradata SQL языка определения данных - Детальные темы Руководство для Teradata 13.10 состояний:

You can not add an identity column to an existing base table, nor can you add the identity column attribute to an existing column.

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

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

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

Другое решение, которое вы можете попробовать, если вам нужно расширить тип данных столбца, который находится за пределами допустимой модификации места. (Например, ДЕСЯТИЧНАЯ (3,0) -> ДЕСЯТИЧНАЯ (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.

+1

Я забыл, что существует опция «Переименовать», иначе бы ответили на вопрос, прежде чем вы это сделали;) – emaillenin

+0

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

+1

@oscilatingcretin nope. разница в времени простоя таблицы. в методе переименования у почти нет времени простоя – emaillenin

Смежные вопросы