2012-08-13 26 views
1

移动列从来就在Teradata数据创建了一个新列,然后我已经从另一个科拉姆数据到这个新colmn。之后,我删除了旧列。 现在我想要做的是将新列移动到旧列的表中相同的位置。 我想问你 - 是否可能?在Teradata的

回答

3

除非业务需要强制执行表定义的列的顺序位置(例如时间戳在表定义中的最后一列),它其实并不重要。如果您有一个使用适当的ROW ACCESS锁定将列视图列(1:1)映射到视图列的V1层,则视图定义可以始终向最终用户和BI应用程序公开列的首选序号位置。

如果必须重新排列您的列执行以下操作:

  1. 提交CREATE TABLE MyDB.MyTable_用你喜欢的顺序位置,列缺省值,任何值列表压缩。
  2. COLLECT STATISTICS ON MyDB.MyTable_ FROM MyDB.MyTable; -- Migrate collected statistics
  3. INSERT INTO MyDB.MyTable_ SELECT /* Columns */ FROM MyDB.MyTable;
  4. RENAME MyDB.MyTable AS MyDB.MyTable1; RENAME TABLE MyDB.MyTable_ AS MyDB.MyTable;
  5. 后确认一切正常,DROP TABLE MyDB.MyTable1;

你也可以执行以下操作来代替步骤1和3:

CREATE TABLE MyDB.MyTable_ 
     (/* Column Definitions in new Order */) AS 
     (SELECT /* New Column Ordering */ 
      FROM MyDB.MyTable) 
     WITH DATA AND STATISTICS 
     {UNIQUE} PRIMARY INDEX (/* Primary Index Columns */); 

统计可能会或可能不会过来使用此填充做法。在创建新表之后,您需要验证这一点。

+1

鲍勃,你的回答总是多于帮助。谢谢! – Dantes 2012-08-14 07:10:38

3

因为这是关系到your previous question,我会尽量在同样的情况下回答。

不,你不能在事后更改列的顺序。当您将一个新列“添加”到现有表格时,它将在表格描述的末尾定义。如果您确实需要列在物理表中以特定顺序显示,则必须完全重新创建表。

但是,您可以创建一个显示在任何你想要的顺序行的视图。实际上,如果您打算将此表用于某种应用程序,则无论如何您都应该创建一个VIEW(这样您可以建立正确的访问锁定)。例如,假设你有一个名为MYTABLE有三列为col_a,COL_B和COL_C表,并且要以相反的顺序它们“显示”:

replace view MYDB.MYTABLE_V as 
locking MYDB.MYTABLE for access 
select COL_C, COL_B, COL_A 
from MYDB.MYTABLE 

使用“替换视图”如果它不将创建视图已经存在,或者如果它存在,则将其替换当然,这意味着如果您改变表格,则必须重新创建视图。为了安全起见,我在表创建程序的注释块中保留了视图定义。

+1

鲍勃,谢谢你的回答!这帮助我清楚了解Teradata的一些疑问。 – Dantes 2012-08-14 07:11:12