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文を使用し変更することができます。