首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在oracle中的特定位置插入列,而不删除和重新创建表?

如何在oracle中的特定位置插入列,而不删除和重新创建表?
EN

Stack Overflow用户
提问于 2011-03-22 20:34:41
回答 3查看 118.2K关注 0票数 29

我有一个特定的场景,我必须在Oracle的现有表中插入两个新列。我不能删除和重新创建表。那么,有没有办法实现呢??

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-22 21:41:49

阿米特-

我不相信一旦创建了表,您只能在表的末尾添加列。一种解决方案可能是尝试这样做:

代码语言:javascript
复制
CREATE TABLE MY_TEMP_TABLE AS
SELECT *
FROM TABLE_TO_CHANGE;

删除要向其中添加列的表:

代码语言:javascript
复制
DROP TABLE TABLE_TO_CHANGE;

在这一点上,您可以从头开始重新构建现有的表,在您想要的地方添加列。假设在本练习中,您希望添加名为"COL2和COL3“的列。

现在将数据重新插入到新表中:

代码语言:javascript
复制
INSERT INTO TABLE_TO_CHANGE (COL1, COL2, COL3, COL4) 
SELECT COL1, 'Foo', 'Bar', COL4
FROM MY_TEMP_TABLE;

当数据被插入到“新旧”表中时,您可以删除临时表。

代码语言:javascript
复制
DROP TABLE MY_TEMP_TABLE;

当我想要在特定位置添加列时,这通常是我所做的。显然,如果这是一个生产在线系统,那么它可能不实用,但只是一个潜在的想法。

-CJ

票数 25
EN

Stack Overflow用户

发布于 2019-01-02 22:05:50

在12c中,您可以利用将从不可见设置为可见的列显示为表的最后一列这一事实:Tips and Tricks: Invisible Columns in Oracle Database 12c

也许这就是@jeffrey-kemp在他的评论中提到的“诀窍”,但那里的链接不再起作用了。

示例:

代码语言:javascript
复制
ALTER TABLE my_tab ADD (col_3 NUMBER(10));
ALTER TABLE my_tab MODIFY (
  col_1 invisible,
  col_2 invisible
);
ALTER TABLE my_tab MODIFY (
  col_1 visible,
  col_2 visible
);

现在,col_3将首先在SELECT * FROM my_tab语句中显示。

注意:这不会改变列在磁盘上的物理顺序,但在大多数情况下,这并不是您想要做的。如果你真的想改变物理顺序,你可以使用DBMS_REDEFINITION包。

票数 8
EN

Stack Overflow用户

发布于 2011-03-23 19:00:05

您仍然不能使用ALTER table选择列的位置:它只能添加到表的末尾。显然,您可以按您想要的任何顺序选择列,所以除非您使用select * FROM列顺序,否则列顺序不应该是个大问题。

如果您确实必须按特定顺序放置它们,并且不能删除并重新创建表,那么您可以删除并重新创建列:-

首先复制表

代码语言:javascript
复制
CREATE TABLE my_tab_temp AS SELECT * FROM my_tab;

然后将想要插入的列删除到要插入的列之后

代码语言:javascript
复制
ALTER TABLE my_tab DROP COLUMN three;

现在添加新列(在本例中为两列)和您删除的列。

代码语言:javascript
复制
ALTER TABLE my_tab ADD (two NUMBER(2), three NUMBER(10));

最后,为重新创建的列添加回数据

代码语言:javascript
复制
UPDATE my_tab SET my_tab.three = (SELECT my_tab_temp.three FROM my_tab_temp WHERE my_tab.one = my_tab_temp.one);

显然,您的更新很可能更加复杂,并且您必须处理索引和约束,并且在某些情况下(LOB列等)将无法使用此更新。此外,这是一种非常可怕的方式-但是表将始终存在,并且您将以所需的顺序得到列。但是列顺序真的那么重要吗?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5391280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档