Teradata: как добавить столбец идентификации в существующую таблицу?

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

Каковы мои варианты здесь?


person oscilatingcretin    schedule 23.12.2011    source источник


Ответы (1)


Существуют онлайн-ресурсы для Teradata, такие как SO, Database Administrators (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, чтобы ввести столбец идентификаторов. (Необязательный)

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

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

person Rob Paller    schedule 24.12.2011
comment
Я забыл, что существует вариант Rename, иначе я бы ответил на вопрос раньше, чем вы;) - person Lenin Raj Rajasekaran; 24.12.2011
comment
Весь ваш ответ в основном резюмирует последний абзац моего вопроса. Короче говоря, метод, который вы предлагаете, - это именно тот метод, которого я пытаюсь избежать. - person oscilatingcretin; 24.12.2011
comment
@oscilatingcretin нет. разница в простое стола. в методе переименования у вас почти нет простоев - person Lenin Raj Rajasekaran; 24.12.2011
comment
Но такое изменение обычно происходит во время производственного развертывания в любом случае, когда установлено ожидаемое время простоя. После того, как все сценарии собраны и выполнены в среде разработки и промежуточной среды (если она существует), выполнение тех же сценариев в производственной среде займет всего несколько секунд. Кроме того, возможность переименования — это просто товар. Вам все еще нужно воссоздать таблицу, чтобы добавить столбец, чего вам не нужно делать imo. - person oscilatingcretin; 24.12.2011
comment
Но вы столкнетесь с другими изменениями модели данных, такими как расширения типов данных, которые не могут быть выполнены в существующей таблице/столбце. В этих случаях вы можете либо выполнить то, что я перечислил выше, либо добавить новый столбец с другим именем и правильным типом данных. Затем запустите UPDATE для таблицы, чтобы переместить данные. Затем отправьте таблицу ALTER для таблицы, чтобы удалить исходный столбец, а затем переименуйте новый столбец как старый столбец. Это три блокировки таблицы и ОБНОВЛЕНИЕ таблицы на неблочном уровне. - person Rob Paller; 25.12.2011
comment
Не пытаюсь усложнять, но я не уверен, что понимаю. Когда вы говорите добавить новый столбец с другим именем, это, кажется, предполагает, что я пытаюсь продублировать существующий столбец и удалить старый, чтобы столбец, который я только что создал, фактически стал старым столбцом. Однако я пытаюсь добавить совершенно новый столбец, подобного которому в настоящее время в этой таблице нет. Я хочу, чтобы этот новый столбец был столбцом идентификаторов, но я не считаю целесообразным тщательно клонировать таблицу и ее метаданные только для того, чтобы просто добавить столбец, особенно когда в этой таблице более 30 полей. - person oscilatingcretin; 25.12.2011
comment
Добавлена ​​ссылка на руководство Teradata, указывающая, что вы просто не можете сделать то, что пытаетесь сделать с существующей базовой таблицей. Я понимаю работу с таблицами со многими столбцами. (В эти выходные я работаю над таблицами с более чем сотней столбцов для производственной реализации.) Вы можете написать команды SHOW TABLE для создания плоского файла с определениями таблиц в них, чтобы упростить добавление столбца. - person Rob Paller; 25.12.2011
comment
Команда SHOW спасла положение. Благодаря этому я могу получить сценарий создания таблицы, который я могу изменить, чтобы добавить столбец идентификаторов. После этого массовые вставки не проблема. Спасибо. - person oscilatingcretin; 27.12.2011