2011-12-23 95 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。这些可能是你最好的信息来源。

页Teradata数据SQL数据定义语言的43 - 详细主题手册为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视图的视图定义以引入标识列。 (可选)

希望这会有所帮助。

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

+1

我忘记了'Rename'选项存在,否则在你做之前会回答这个问题;) – emaillenin 2011-12-24 15:17:30

+0

你的整个答案基本上总结了我的问题的最后一段。总之,你提出的方法是我试图避免的确切方法。 – oscilatingcretin 2011-12-24 15:32:11

+1

@oscilatingcretin nope。不同之处在于表格的停机时间。在重命名方法中,您几乎没有停机时间 – emaillenin 2011-12-24 16:14:05