スポンサードリンク
どうも、しぐまです!
開発をしているとテーブルを作成した後に仕様変更などでテーブルカラムの定義を変更しなければならない、なんてことがあったりします。
テーブルを削除して、CREATE文を修正してテーブル再作成・・・をしていると、中身のデータのバックアップを取っておいて、再作成後にINSERTしないといけなくなり、面倒です。
しかし、そんな面倒なことをしなくてもOracle SQLにはテーブル定義を変更するALTER TABLE文に、データを保持したままテーブルカラムの定義を変更してくれるのMODIFY句が用意されています!
例えば、下記のようなテーブル定義・データが存在するとします。
1 2 3 4 5 6 |
CREATE TABLE EMPLOYEE ( emp_id VARCHAR2(3 BYTE) PRIMARY KEY, emp_name VARCHAR2(10 BYTE), emp_age NUMBER ); |
EMP_ID | EMP_NAME | EMP_AGE |
---|---|---|
001 | taro | 25 |
002 | miki | 23 |
003 | hironobu | 33 |
では、このEMPLOYEEテーブルへ「emp_name = “kyarypamyupamyu”」のデータを挿入してみましょう。結果はこうなります。
『次のコマンドの開始中にエラーが発生しました : 行 10 –
ORA-12899: 列”EMPLOYEE”.”EMP_NAME”の値が大きすぎます(実際: 15、最大: 10)』
当然の結果ですね、テーブル定義では10BYTE分しかカラムサイズを用意していないので、15BYTEの文字列はサイズ溢れでエラーになっています。
それでは、このデータがテーブルへ保管できるように「emp_name」カラムのサイズを10BYTE から20BYTEに拡張してみましょう。SQLは以下のように記述します。
<カラムサイズ変更>
1 2 3 |
ALTER TABLE EMPLOYEE MODIFY ( emp_name VARCHAR2(20 BYTE) ); |
このSQL実行後は、先ほどエラーになったINSERT文が正常終了するようになります。
また、このMODIFY関数はテーブルカラムのデフォルト値の変更や、NOT NULL制約の付与・削除なども行えます。
<デフォルト値の変更>
1 2 3 |
ALTER TABLE EMPLOYEE MODIFY ( emp_name DEFAULT 'Unknown' ); |
<NOT NULL制約の付与>
1 2 3 |
ALTER TABLE EMPLOYEE MODIFY ( emp_name NOT NULL ); |
<NOT NULL制約の削除>
1 2 3 |
ALTER TABLE EMPLOYEE MODIFY ( emp_name NULL ); |
注意点!
上記のようにカラム定義のサイズを拡張する場合は、中身のデータを考慮する必要はないのですが、サイズを縮小する場合は、中のデータに縮小後のサイズよりも大きいサイズの文字列が含まれているとエラーとなりますので、注意が必要です。
スポンサードリンク