オラクル
転載の場合は出典を明記してください!
ORACLE を使用したことのある人なら誰でも、ORACLE での列名とテーブルの順序の変更が非常に面倒な作業であることを知っています。そのための簡単な方法を次に示します。
SQL> select object_id from all_objects where owner='SCOTT' and object_name='T1';
OBJECT_ID
----------
6067
SQL> select obj#,col#,name from sys .col$ where obj#=6067;
OBJ# COL#
---------- ----------
NAME
----------- --------------------------------------------------
6067 1
ID
6067 2
NAME
SQL> update sys.col$ set name='NEW_ID' ,col#=3 where obj#=6067 and name='ID';
1 行が更新されました。
SQL> update sys.col$ set name='MY_NAME',col#=1 where obj#=6067 and name='NAME';
1 行が更新されました。
SQL> update sys.col$ setcol#= 2 obj#=6067 およびcol#=3;
1 行が更新されました。
SQL> commit;
コミットが完了しました。
SQL> select * from scott.t1;
ID NAME
----- - ---- --------------------
3 cheng
2 yong
1 xin
2 gototop
1 topcio
2 yongxin
1 cyx
7 rows選択された .
SQL> 即時シャットダウン
データベースが閉じられました。
データベースがマウント解除されました。
ORACLE インスタンスがシャットダウンされました。
システム グローバル領域の合計 128159368 バイト
固定サイズ 732808 バイト
可変サイズ 11744051 2 tes
データベースバッファー 8388608 バイト
やり直しバッファー 1597440 バイト
データベースがマウントされました。
データベースが開きました。
SQL> select * from scott.t1;
MY_NAME NEW_ID
-------- ------------- ----------
cheng 3
yong 2
xin 1
gototop 2
topcio 1
yongxin 2
cyx 1
7 行が選択されました。
これまでテーブルに SCOTT.T1 を配置しました。列名と順序はすべて指定されています。列名を変更せずに順序のみを変更したい場合は、一度に UPDATE を実行するだけです。 SYS.COL$ の COL# と NAME が両方とも UNIQUE であるためです。
この方法には一定のリスクがありますが、特に大きなテーブルでは効果が明らかですが、一般的な方法を使用すると、より多くのストレージ領域、ロールバックセグメント、時間のオーバーヘッドが必要になります。