28章 テーブル変更
では、今回はテーブルの変更について学んでいきましょう。
前回はテーブルの作成について学びました。
しかし、テーブルの作成後、テーブルの構成を変更したい場合もありますね。
そのような時は、ALTER文を使用して、テーブルの定義を変更します。
ちなみにALTER文はDDL文となります。
以下構文です。
[構文] 列のデータ型、デフォルト値の変更
ALTER TABLE 表名 MODIFY
(列名 データ型 [ DEFAULT 値 ] …);
[構文] 列の追加
ALTER TABLE 表名 ADD
(列名 データ型 [ DEFAULT 値 ] …);
[構文] 列の削除
ALTER TABLE 表名 DROP ( 列名 [,列名] );
[構文] テーブル名の変更
ALTER TABLE 表名 RENAME TO 新表名;
[構文] 列名の変更
ALTER TABLE 表名 RENAME
COLUMN 列名 TO 新列名;
では実行例を見ていきましょう。
SQL> desc emp1
Name Null? Type
------------------------ -------- ----------------------------
ID NUMBER(5)
NAME VARCHAR2(30)
MAIL VARCHAR2(30)
TEL VARCHAR2(10)
SQL> select * from emp1;
ID NAME MAIL TEL
---------- ------------- ---------- ----------
1 Tom TEST 090
2
SQL> alter table emp1 modify ( name varchar2(50));
Table altered.
SQL> desc emp1
Name Null? Type
---------------------- -------- ----------------------------
ID NUMBER(5)
NAME VARCHAR2(50)
MAIL VARCHAR2(30)
TEL VARCHAR2(10)
上記例ではNAME列のサイズを50に変更しています。
DESCRIBEコマンドで確認すると、VARCHAR2(50)となっていることが分かります。
また、既に挿入されている行のサイズよりも小さいサイズに変更することは出来ません。
SQL> alter table emp1 modify ( name varchar2(2));
alter table emp1 modify ( name varchar2(2))
*
ERROR at line 1:
ORA-01441: cannot decrease column length because some value is
too big
NAME列にはTomという行が挿入されています。
つまり3バイトのデータがNAME列に格納されています。
そのため、varchar2(2)はサイズ2バイトに変更していますが、
データは3バイト格納されているため、エラーが発生します。
SQL> alter table emp1 modify ( name number(10));
alter table emp1 modify ( name number(10))
*
ERROR at line 1:
ORA-01439: column to be modified must be empty to change datatype
上記はNAME列をVARCHAR2からNUMBERに変更しています。
しかし、NAME列には既に文字データが格納されているため、
NUMBER型に変更しようとしてもエラーが発生します。
SQL> ALTER TABLE emp1 add
2 ( address varchar2(50),
3 emp_date date default sysdate );
Table altered.
SQL> desc emp1
Name Null? Type
--------------------- -------- ----------------------------
ID NUMBER(5)
NAME VARCHAR2(50)
MAIL VARCHAR2(30)
TEL VARCHAR2(10)
ADDRESS VARCHAR2(50)
EMP_DATE DATE
今回の例では、address列とemp_date列を追加しています。
またemp_date列はデフォルト値を設定し、SYSDATE関数を指定しました。
SYSDATE関数は今日日付を表示する関数でしたね。
つまりemp_date列に値を挿入しなかった場合は、デフォルトで挿入した日付が格納されます。
SQL> ALTER TABLE emp1 drop (address);
Table altered.
SQL> desc emp1
Name Null? Type
----------------------- -------- ----------------------------
ID NUMBER(5)
NAME VARCHAR2(50)
MAIL VARCHAR2(30)
TEL VARCHAR2(10)
EMP_DATE DATE
上記実行例ではaddress列を削除しています。
いかがでしたでしょうか。
表作成後に定義変更する場合はALTER TABLE文を使用し変更することができます。