我在 Teradata 中创建了一个新列,然后将数据从另一个列移动到这个新的列中。之后,我删除了旧列。我现在想做的是将新列 n 移动到表中旧列所在的相同位置。我想问你 - 这可能吗?
除非业务需求强制要求在表定义中强制列的序号定位(例如,时间戳是表定义中的最后一列),否则这并不重要。如果您的 V1 层使用适当的 ROW ACCESS 锁定映射列的视图列,则视图定义始终可以向最终用户和 BI 应用程序公开列的首选序号位置。
如果必须对列重新排序,请执行以下操作:
- 提交具有首选序号位置、列默认值和任何值列表压缩的
CREATE TABLE MyDB.MyTable_
。 -
COLLECT STATISTICS ON MyDB.MyTable_ FROM MyDB.MyTable; -- Migrate collected statistics
-
INSERT INTO MyDB.MyTable_ SELECT /* Columns */ FROM MyDB.MyTable;
-
RENAME MyDB.MyTable AS MyDB.MyTable1; RENAME TABLE MyDB.MyTable_ AS MyDB.MyTable;
- 验证一切正常后,
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
使用"替换视图"将创建视图(如果它不存在)或替换它(如果它存在)。 当然,这意味着如果更改表,则必须再次重新创建视图。 为了安全起见,我将视图定义保留在我的表创建程序的注释块中。