在 Teradata 中移动列



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

除非业务需求强制要求在表定义中强制列的序号定位(例如,时间戳是表定义中的最后一列),否则这并不重要。如果您的 V1 层使用适当的 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;

您还可以执行以下操作,而不是步骤 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 */);

使用此方法填充的统计信息可能会也可能不会。您需要在创建新表后验证这一点。

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

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

但是,您可以创建一个 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

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