5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Oralceのカラムの型を変換することで躓いた話

Posted at

以下のような形でテーブルを作成

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成約
  • デフォルト値
5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?