【问题标题】:Oracle move column to the first positionOracle 将列移动到第一个位置
【发布时间】:2021-08-04 15:11:57
【问题描述】:

有没有办法将 Oracle 表中的列从最后一个位置移动到第一个位置?有人删除了 ID 列,然后重新创建了它。所以现在到了最后,这是一个问题,因为我们的一些 PHP 脚本使用第一列作为标识符(一个抽象模型和 100 多个使用此基础对象的其他模型......)

另见:

【问题讨论】:

  • 你可以选择你需要的列而不是*。
  • @Nitrox:他解释了这种解决方法的必要性......
  • @nickf:是的,更改模型需要大量工作。但是删除和重新创建表格也是如此。再说一次,如果有人可以删除 ID 列,则数据库可能不依赖外键关系。
  • 这只是强调了为什么您从不在生产代码中使用 SELECT * 的一个(几个)原因。 PHP 脚本应该指定他们感兴趣的列。

标签: database oracle


【解决方案1】:

Oracle FAQ 说:

Oracle 只允许将列添加到现有表的末尾。

你必须重新创建你的表。

RENAME tab1 TO tab1_old;

CREATE TABLE tab1 AS SELECT id, <the rest of your columns> FROM tab1_old;

【讨论】:

  • 但是必须更新约束、索引等...我在 Oracle 11g 中尝试过,它工作正常。在旧版本中,我遇到的问题是创建的表的列具有选定值的长度 - 例如,当有类型为 varchar2(20) 的字段且列中的最大长度为 5 时,新表列具有 varchar2(5)
【解决方案2】:

修改表格列的逻辑顺序的最简单方法是重命名表格并创建具有“正确”列位置的视图:

ALTER TABLE your_table RENAME TO your_table_t;

CREATE VIEW your_table AS SELECT <columns in the right order> FROM your_table_t;

-- grants on the view (the same as the table)
GRANT ** TO ** ON your_table;

您的应用程序的行为就像列处于“正确”位置一样。您不必接触物理结构。

【讨论】:

    【解决方案3】:

    在 Oracle 12c 中,现在更容易在逻辑上重新排列列。可以通过使列不可见/可见来实现。如果将不可见列更改为可见,则该列将出现在排序的最后。

    Consider Using Invisible Columns

    创建 wxyz 表:

    创建表 t ( w INT,
    y VARCHAR2, z VARCHAR2, x VARCHAR2

    );

    将x列重新排列到中间:

    ALTER TABLE wxyz MODIFY (y INVISIBLE, z INVISIBLE); ALTER TABLE wxyz MODIFY (y VISIBLE, z VISIBLE);

    描述 wxyz;

    姓名

    w

    x

    是的

    z

    【讨论】:

      【解决方案4】:

      我知道的唯一方法是重新创建表(通过重命名/临时表,以免丢失数据)。

      我认为不可能简单地更改列顺序。

      【讨论】:

        【解决方案5】:

        如果没有大量数据/列,您可以简单地按照您想要的顺序重命名列。然后只需从“您的表名”中删除 *。这对我来说是一个很好的解决方案,因为我还没有插入很多记录。

        【讨论】:

          【解决方案6】:

          您可能希望通过视图访问您的表,因此如果它对应用程序技术很重要,您可以轻松地重新排列逻辑顺序。

          【讨论】:

            【解决方案7】:

            无法在 oracle 中移动列。它将在最后一个位置创建。如果有人想要,则需要创建视图或创建新表

            【讨论】:

            【解决方案8】:

            我一直用这个:

            ALTER TABLE MOVE COLUMN column_name TO ordinal_position;
            

            【讨论】:

            • -1:据我所见,这不是有效的 Oracle 语法,至少我期望像 ALTER TABLE table_name MOVE COLUMN column_name TO ordinal_position; 这样的语法。我正在使用Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
            猜你喜欢
            • 2014-04-12
            • 2011-03-31
            • 1970-01-01
            • 2018-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-29
            相关资源
            最近更新 更多