我需要使用此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数据库严重缺乏在线支持,我只遇到一个选项,即基本上创建带有标识列的表的副本,并从旧表到新表进行批量插入更改对新表的所有引用。我发现很难相信这是唯一可行的方法。
我有什么选择?
答案 0 :(得分:3)
Teradata有在线资源,如SO,数据库管理员(Stack Exhcange)和Teradata Developer Exchange。这些可能是您最好的信息来源。
Teradata 13.10的Teradata SQL数据定义语言 - 详细主题手册第43页指出:
您不能将标识列添加到现有基表,也不能 您将标识列属性添加到现有列。
这可能看起来很乏味,但这种方法非常有效,可以最大限度地减少最终用户数据的停机时间。它运行良好,是我们在对具有数十亿行的表进行数据模型更改时使用的首选方法。由于Teradata优化器应选择数据块级MERGE操作而不是逐行选择,因此应将数据插入新表中进行相当好的优化。
希望这有帮助。
如果需要扩展超出允许就地修改的列的数据类型,则可以尝试另一种解决方案。 (例如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手册中找到解释扩展列数据类型边界的规则。