我在 Teradata 中创建了一个新列,然后将数据从另一个列移动到这个新列中。之后,我删除了旧列。我现在想做的是将新列移动到旧列所在的表中的相同位置。我想问你——这可能吗?
问问题
4951 次
2 回答
3
除非业务需求强制在表定义中列的顺序定位(例如时间戳是表定义中的最后一列),否则它并不重要。如果您有一个 V1 层将视图列映射到列 (1:1) 并具有适当的 ROW ACCESS 锁定,则您的视图定义始终可以将列的首选序号位置公开给最终用户和 BI 应用程序。
如果您必须对列重新排序,请执行以下操作:
- 提交
CREATE TABLE MyDB.MyTable_
带有您首选的序号位置、列默认值和任何值列表压缩的 a。 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 */);
使用这种方法可能会或可能不会填充统计数据。创建新表后,您需要验证这一点。
于 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 回答