1

我需要使用以下 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 数据库严重缺乏在线支持,我只遇到一个选项,即基本上创建带有标识列的表的副本,并从旧表批量插入新表,并将所有引用更改为新表。我很难相信这是唯一可行的方法。

我在这里有什么选择?

4

1 回答 1

3

有 Teradata 的在线资源,例如 SO、Database Administrators (Stack Exhcange) 和 Teradata Developer Exchange。这些可能是您最好的信息来源。

Teradata SQL 数据定义语言的第 43 页- 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 手册中找到。

于 2011-12-24T15:02:45.143 回答