Teradata:如何在现有表中添加标识列?

时间:2011-12-23 18:13:40

标签: alter-table teradata identity-column

我需要使用此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 个答案:

答案 0 :(得分:3)

Teradata有在线资源,如SO,数据库管理员(Stack Exhcange)和Teradata Developer Exchange。这些可能是您最好的信息来源。

Teradata 13.10的Teradata SQL数据定义语言 - 详细主题手册第43页指出:

  

您不能将标识列添加到现有基表,也不能   您将标识列属性添加到现有列。

这可能看起来很乏味,但这种方法非常有效,可以最大限度地减少最终用户数据的停机时间。它运行良好,是我们在对具有数十亿行的表进行数据模型更改时使用的首选方法。由于Teradata优化器应选择数据块级MERGE操作而不是逐行选择,因此应将数据插入新表中进行相当好的优化。

  1. 使用标识列
  2. 创建新表
  3. 确保目标表更改为原始表。
  4. 插入从旧表中选择数据到新表中。
  5. 将{orig_table}重命名为{orig_table} _old。
  6. 将{new_table}重命名为{orig_table}。
  7. 验证新表的数据并删除{orig_table} _old
  8. 刷新1:1视图的视图定义以引入标识列。 (可选)
  9. 希望这有帮助。

    如果需要扩展超出允许就地修改的列的数据类型,则可以尝试另一种解决方案。 (例如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手册中找到解释扩展列数据类型边界的规则。