以下のような形でテーブルを作成
CREATE TABLE EMPLOYEE(
"EMP_ID" NUMBER(10,0) Default 0 NOT NULL,
"EMP_NAME" NVARCHAR2(14) NOT NULL,
"UPD_USER_ID" NVARCHAR2(50) Default 'EMPAPP' NOT NULL,
"UPD_DATE" DATE Default SYSDATE NOT NULL
)
TABLESPACE EMPAPPS;
この状態でレコードが何件か追加されている状態で、
UPD_USER_IDについて、文字列から数値の型に変更することになった。
ALTER TABLE EMPLOYEE MODIFY (UPD_USER_ID NUMBER(10))
すると、エラーが発生する。
ORA-01439: データ型を変更するには、修正する列を空にする必要があります
これに則りデータを削除しようとする。
UPDATE EMPLOYEE SET UPD_USER_ID = NULL;
今度はNULLエラーになってしまった。
ORA-01407: (EMPAPPS.EMPLOYEE .UPD_USER_ID)をNULLには更新できません。
なのでnull成約を解除したうえでNULLでアップデート。
ALTER TABLE EMPLOYEE MODIFY UPD_USER_ID NULL;
UPDATE EMPLOYEE SET UPD_USER_ID = NULL;
これでテーブルのすべてのレコードのUPD_USER_IDはNULLになったので再度型の変換を実行する。
ALTER TABLE EMPLOYEE MODIFY (UPD_USER_ID NUMBER(10));
またエラーが発生する。
ORA-01722: 数値が無効です。
むむ、、、こっからが本題。
ひらめきにより以下の推測。
カラム定義を変更する→デフォルト値の再評価が走る→設定したデフォルト値が「EMPAPP」で数値ではないため、上記のエラーが出ていると推測。
よってデフォルト値の削除を実行する。
ALTER TABLE EMPLOYEE MODIFY UPD_USER_ID DEFAULT NULL;
その後、型の変換を実行する。
ALTER TABLE EMPLOYEE MODIFY (UPD_USER_ID NUMBER(10));
という形で型の変換が出来ました。
カラムの型変換時に注意しないと行けないのは以下二点ということですね。
- NULL成約
- デフォルト値