1

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

4

2 回答 2

3

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

如果您必须对列重新排序,请执行以下操作:

  1. 提交CREATE TABLE MyDB.MyTable_带有您首选的序号位置、列默认值和任何值列表压缩的 a。
  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 */);

使用这种方法可能会或可能不会填充统计数据。创建新表后,您需要验证这一点。

于 2012-08-13T13:27:00.643 回答
3

由于这与您之前的问题有关,因此我将尝试在相同的上下文中回答。

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

但是,您可以创建一个按您想要的任何顺序显示列的视图。事实上,如果您打算将此表用于某种应用程序,则无论如何都应该创建一个 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

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

于 2012-08-13T13:54:32.217 回答