我在Teradata中创建了一个新列,然后我将数据从另一个列移动到这个新的列中。之后,我删除了旧列。 我现在要做的是将新列移动到旧列所在表中的相同位置。 我想问你 - 这可能与否?
答案 0 :(得分:3)
除非业务需求强制执行表定义中列的顺序定位(例如,时间戳是表定义中的最后一列),否则它并不重要。如果您有一个V1层,它将列(1:1)的视图列映射到正确的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 */);
使用此方法可能会或可能不会填充统计数据。您将需要在创建新表后验证这一点。
答案 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。