在Teradata中移动列

时间:2012-08-13 09:06:05

标签: sql ddl teradata

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

2 个答案:

答案 0 :(得分:3)

除非业务需求强制执行表定义中列的顺序定位(例如,时间戳是表定义中的最后一列),否则它并不重要。如果您有一个V1层,它将列(1:1)的视图列映射到正确的ROW ACCESS锁定,那么您的视图定义始终可以将列的首选序数位置公开给最终用户和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;
  6. 您也可以执行以下操作,而不是步骤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 :(得分:3)

由于这与your previous question有关,我将尝试在同一上下文中回答。

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

但是,您可以创建一个VIEW,以任何您想要的顺序显示列。实际上,如果您要将此表用于某种应用程序,则应在任何情况下创建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

如果视图尚不存在,则使用“替换视图”将创建视图,否则将替换视图。当然,这意味着如果您更改了表,则必须再次重新创建视图。为了安全起见,我一直在我的表创建程序中的注释块中查看definitons。