Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中对表的列重新排序_Sql_Oracle_Rename - Fatal编程技术网

Sql 在Oracle中对表的列重新排序

Sql 在Oracle中对表的列重新排序,sql,oracle,rename,Sql,Oracle,Rename,我有一个50+列的表,我需要交换前两列的顺序。使用Oracle实现这一目标的最佳方法是什么?假设表名为ORDERDETAILS,按原样,前两列为ITEM_ID和ORDER_ID。重命名完成后,表名仍应为ORDERDETAILS,但前两列将为ORDER_ID和ITEM_ID。FWIW、列类型和其余列,其顺序为irelevent 如果我错了,请纠正我,但我认为一般步骤是: 重命名现有表。 删除主键约束。 以正确的列顺序重新创建表。 列表项 运行插入到。。选择此项可将数据从临时移动到步骤3中的表格中。

我有一个50+列的表,我需要交换前两列的顺序。使用Oracle实现这一目标的最佳方法是什么?假设表名为ORDERDETAILS,按原样,前两列为ITEM_ID和ORDER_ID。重命名完成后,表名仍应为ORDERDETAILS,但前两列将为ORDER_ID和ITEM_ID。FWIW、列类型和其余列,其顺序为irelevent

如果我错了,请纠正我,但我认为一般步骤是:

重命名现有表。 删除主键约束。 以正确的列顺序重新创建表。 列表项 运行插入到。。选择此项可将数据从临时移动到步骤3中的表格中。 放下临时表。 我对甲骨文几乎没有经验,所以我可能错过了一两步

主键是否意味着Oracle中的索引?删除主键是否也会删除索引

SQL示例非常受欢迎


编辑:联合国真诚地感谢那些质疑为什么需要这样做而不是提供帮助的人。回答你为什么需要这样做的问题:我是按照别人的命令做的,他们说我需要这样做,列的顺序很重要。我在这方面的想法/观点是不相关的。

看看包DBMS\u的重新定义。它将使用新的顺序重新生成表。这可以通过在线表格完成

正如菲尔·布朗所说,在做这件事之前要仔细考虑。但是,在更新时扫描行中的列和移动数据会产生开销。我不按特定顺序使用的列排序规则:

将相关列分组在一起。 非空列在可空列之前。 首先是频繁搜索的未编入索引的列。 最后很少填充可空的列。 首先是静态列。 稍后可更新的varchar列。 其他可搜索列之后的索引列。
这些规则相互冲突,并且没有在最新版本上测试所有规则的性能。大多数已经在实践中进行了测试,但我没有记录结果。放置选项针对三个相互冲突的目标之一:易于理解的列放置;快速数据检索;而且更新时数据移动量最小。

很遗憾Oracle不允许这样做,开发人员一直要求我这样做

这里有一个稍微危险的,有点快速和肮脏的方法:

确保有足够的空间来复制表 注意任何约束、授权、索引、同义词、触发器等。。也许是其他一些我没想过的东西,那是属于桌子的? 创建表\u右\u列作为从表\u错误\u列中选择第1列第3列、第2列;-请注意我们如何更正列的位置: 删除表\u错误的\u列; 'ALTER TABLE_right_columns重命名为TABLE_ROWER_columns` 现在是令人讨厌的部分:重新创建上面步骤2中提到的所有项目 检查哪些代码现在无效,然后重新编译以检查错误

下次创建表时,请考虑未来的要求!p> 自从Oracle 12c发布以来,现在更容易在逻辑上重新排列列

Oracle 12c增加了对使列不可见的支持,该功能可用于逻辑上重新排列列

引自:

使不可见列可见时,该列将作为最后一列包含在表的列顺序中

实例 创建一个表:

CREATE TABLE t (
    a INT,
    b INT,
    d INT,
    e INT
);
添加一列:

ALTER TABLE t ADD (c INT);
将柱移动到中间:

ALTER TABLE t MODIFY (d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY (d VISIBLE, e VISIBLE);
描述t

信用
我从中了解到这一点。

将视图用于更改专栏位置: 创建视图位置 像 选择co1\U 1、col\U 3、col\U 2 从无序位置 应该有帮助

发出此请求是为了在使用[table_name]中的SELECT*时生成某些报告。或者,有些业务采用层次结构方法,将信息按顺序排列,以便从后端获得更好的可读性

谢谢
Dilip

我遵循了Jonas的上述解决方案,在我需要添加第二列之前,它一直运行良好。我发现,在使列再次可见时,Oracle不一定按照语句中列出的顺序将它们设置为可见

为了证明这一点,请遵循上面乔纳斯的例子。正如他所展示的,一旦步骤完成,表格就会按照您预期的顺序排列。然后,当您添加另一列时,情况会发生变化,如下所示:

从乔纳斯的例子继续:

在列C之前添加要插入的另一列

ALTER TABLE t ADD (b2 INT);
ALTER TABLE t MODIFY (c INVISIBLE, d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY (c VISIBLE, d VISIBLE, e VISIBLE);
使用上面演示的技术将新添加的B2列移到C列之前

ALTER TABLE t ADD (b2 INT);
ALTER TABLE t MODIFY (c INVISIBLE, d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY (c VISIBLE, d VISIBLE, e VISIBLE);
描述t

如上所示,C列已移到末尾。上面的ALTERTABLE语句似乎是按照D、E、C的顺序处理列的,而不是按照语句中指定的顺序(可能是物理表顺序)。为了确保将柱放置在需要的位置,有必要使柱逐个可见 按所需的顺序

ALTER TABLE t MODIFY (c INVISIBLE, d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY c VISIBLE;
ALTER TABLE t MODIFY d VISIBLE;
ALTER TABLE t MODIFY e VISIBLE;
描述t


我更喜欢MS SQL,但我想不出你为什么需要放弃PK。您的步骤不包括创建临时表的步骤,除非您引用的是重命名的原始表。2-删除所有约束,然后将约束添加到临时表中。新表的外接程序统计信息集合。我也要备份。我也不确定你在用索引做什么。我不确定我能想出什么理由需要它,但如果只是为了索引,你可以在order_id、item_id而不是item_id上创建索引,order_id.大胆尝试一下你需要重新定义表的动机。对于那些问为什么它有用的人:我有一个应用程序,它可以向现有表添加一些元数据列。如果将这些列放在前面,以便在查看表时,我们添加的列在sqldeveloper中立即可见,这对所有相关人员都很有用。如果列顺序相同,则在两个表之间复制时,您可以使用SELECT*而不是命名每一列。请记住……即使DBMS_重新定义也只是,在封面下,用新的列顺序创建一个新表,将所有数据从旧表移动到新表,删除旧表,并重命名新表。旧主题,但我认为不需要首先频繁搜索未索引的列。或在其他可搜索列之后添加索引列。这与Oracle 9i或更早版本非常相似,当时定位最右边的列需要大量的CPU开销。当时我当然需要这样做,但从那以后就不行了。@davidardridge Oracle在提高表扫描速度上花了很多精力,并且可能显著降低了扫描最右边列的成本,我希望跳过列仍然会有成本。一个明确的答案需要测试,我没有资源去做。@BillThor的轶事不是数据,但我在很多年前建立了一个高度非规范化的数据集市,大约有250列——大部分是数字,一些varchar2散落其中——我当时测量,无论是搜索还是全表扫描,在读取最右边的列时,这一点都非常重要。这绝对值得经历物理上重新排序表的痛苦,直到它突然在某个主要版本中被修复。我想是9i还是10g。可能会找到asktom的评论…谢谢,这正是我需要的!工作得很好。@Jonas,那么我们也需要在查询中更改顺序?@UnKnown,如果未指定列名,则为插入指定的值也将使用新的顺序。下面是一个使用不可见列的例程,允许您按任何所需顺序对列重新排序。同一篇文章的注释。。。。。使用不可见列的一个积极的副作用是能够在逻辑上重新排列表中的列。我强调,这将是对列的逻辑而不是物理重新排序。请注意,在磁盘上,列实际上将存储为A、B、D、E和C。如何保留字段注释:
Name
----
A
B
B2
C
D
E