web-dev-qa-db-ja.com

Oracleのテーブルの列を並べ替える

50列以上のテーブルがあり、最初の2列の順序を入れ替える必要があります。 Oracleを使用してこれを達成する最良の方法は何ですか?テーブル名がORDERDETAILSであり、最初の2つの列がITEM_IDとORDER_IDであると仮定します。名前の変更が完了すると、テーブル名はまだORDERDETAILSになっているはずですが、最初の2つの列はORDER_IDとITEM_IDになります。 FWIW、列タイプ、残りの列、およびそれらの順序はireleventです。

間違っている場合は修正してください。しかし、一般的な手順は次のとおりです。

  1. 既存のテーブルの名前を変更します。
  2. 主キー制約を削除します。
  3. 正しい列順序でテーブルを再作成します。
  4. リストアイテム
  5. INSERT INTO .. SELECTを実行して、ステップ#3でデータをtempからテーブルに移動します。
  6. 一時テーブルを削除します。

私はOracleの経験がほとんどないので、おそらく1つまたは2つ足りません。

主キーはOracleのインデックスを意味しますか?主キーを削除すると、インデックスも削除されますか?

SQLの例は大歓迎です。

編集:助けを提供するのではなく、なぜそれを行う必要があるのか​​疑問に思う人々に不誠実な感謝。なぜそれを行う必要があるのか​​という質問に答えるために、私はこの方法でそれを行う必要があると言う他の誰かからの指示に従っています。列の順序は重要です。これについての私の考え/意見は無関係です。

36
Ryan Rodemoyer

パッケージDBMS_Redefinitionを見てください。新しい順序でテーブルを再構築します。テーブルでオンラインで行うことができます。

Phil Brownが指摘したように、これを行う前に慎重に考えてください。ただし、行の列をスキャンし、更新時にデータを移動するとオーバーヘッドが発生します。私が使用する列の順序付けルール(順不同):

  • 関連する列をグループ化します。
  • NULL可能列の前のNULL列ではありません。
  • 最初に頻繁に検索されるインデックスなしの列。
  • まれに埋められたヌル可能列が最後になります。
  • 最初に静的列。
  • 後で更新可能なvarchar列。
  • 他の検索可能な列の後のインデックス付き列。

これらのルールは競合しており、最新リリースですべてのパフォーマンスがテストされているわけではありません。ほとんどは実際にテストされていますが、結果を文書化しませんでした。配置オプションは、3つの相反する目標の1つをターゲットとしています。わかりやすい列の配置。高速データ取得;更新時の最小限のデータ移動。

17
BillThor

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);

DESCRIBE t;

Name
----
A
B
C
D
E

クレジット

これについては、 Oracle 12cの新機能に関するTom Kyteの記事 から学びました。

56
Jonas Meller

Oracleがこれを許可しないのは悲しいことです。開発者からいつもそうするように頼まれます。

少し危険な、やや迅速で汚い方法を次に示します。

  1. テーブルをコピーするのに十分なスペースがあることを確認してください
  2. 制約、助成金、インデックス、シノニム、トリガーなどに注意してください。おそらく、テーブルに属している他の要素については、私が考えていないことでしょうか?
  3. CREATE TABLE table_right_columns AS SELECT column1 column3, column2 FROM table_wrong_columns; -- Notice how we correct the position of the columns :)
  4. DROP TABLE table_wrong_columns;
  5. 'ALTER TABLE table_right_columns RENAME TO table_wrong_columns; `
  6. 今度は不機嫌な部分:上記の手順2でメモしたすべてのアイテムを再作成します
  7. 現在無効なコードを確認し、再コンパイルしてエラーを確認します

そして、次回テーブルを作成するときは、将来の要件を考慮してください! ;)

7
grokster

列の位置を変更する場合は、ビューを使用してください。SELECTco1_1、col_3、col_2 FROM UNORDERDED_POSITIONとしてCREATE VIEW CORRECTED_POSITIONが役立ちます。

この要求は、SELECT * FROM [table_name]を使用している場所でいくつかのレポートが作成されるように作成されます。または、ビジネスによっては、バックエンドから読みやすくするために情報を配置する階層アプローチがあります。

ありがとうディリップ

0
dilip