【发布时间】:2011-06-23 19:24:16
【问题描述】:
我有一个包含 50 多列的表,我需要交换前两列的顺序。使用 Oracle 完成此任务的最佳方法是什么?假设表名是 ORDERDETAILS,前两列是 ITEM_ID 和 ORDER_ID。重命名完成后,表名仍应为 ORDERDETAILS,但前两列将为 ORDER_ID 和 ITEM_ID。 FWIW、列类型和其余列及其顺序无关紧要。
如果我错了,请纠正我,但我认为一般步骤是:
- 重命名现有表。
- 删除主键约束。
- 使用正确的列顺序重新创建表。
- 列表项
- 运行 INSERT INTO .. SELECT 以将数据从 temp 移动到第 3 步中的表中。
- 删除临时表。
我对 Oracle 的经验很少,所以我可能缺少一两步。
主键是否意味着 Oracle 中的索引?删除主键是否也会删除索引?
非常感谢 SQL 示例。
编辑:感谢那些质疑为什么需要完成而不是提供帮助的人。回答您关于为什么需要完成的问题:我正在遵循其他人的命令,他们说我需要这样做,并且列的顺序很重要。我对此的想法/意见无关紧要。
【问题讨论】:
-
我更像是一个 MS SQL 人,但我想不出你需要放弃 PK 的任何理由。您的步骤不包括创建临时表,除非您指的是重命名的原始表。
-
2 - 删除所有约束,然后 3a 将约束添加到 temp_table。为新表添加统计信息集合。备份也。也不知道你在用索引做什么。
-
不确定我能想到任何需要这个的理由,但如果它只是为了索引(?)的目的,你可以只在 order_id、item_id 而不是 item_id、order_id 上创建索引。猛烈抨击您需要重新定义表格的动机。
-
对于那些询问它为什么有用的人:我有一个应用程序可以将一些元数据列添加到现有表中。如果将这些列放在前面,这对所有相关人员都很有用,以便在查看表时我们添加的列在 sqldeveloper 中立即可见。
-
如果列顺序相同,在两个表之间复制时,您可以只使用 SELECT * 而不是命名每个该死的列。