第8章 変更(補足)

1.表の変更

作成済みの表に対し、さまざまな変更を行うことができる。
表の変更には、ALTER TABLEを使用する。
(ALTER TABLEシステム権限が必要)

■新しく列を追加する

《構文》

ALTER TABLE 表名
 ADD ( 列名 列のデータ型 [列制約構文] [,列名 列のデータ型 [列制約構文]]);

例)、emp表にmail_address列を追加する

ALTER TABLE emp
 ADD (mail_address VARCHAR2(50));

■列を削除する(Oracle8iから)

《構文》

ALTER TABLE 表名
 DROP COLUMN 列名;

※削除する対象の列にNULL値以外のデータが入っていてはいけない!

例)、emp表のmail_address列を削除する

ALTER TABLE emp
 DROP COLUMN mail_address;

■表名の変更

《構文》

RENAME 旧表名 TO 新表名;

例)、emp表をemployee表に改名する

RENAME emp TO employee;

※表名の変更はALTER TABLEではなく、RENAME TOで行う!
※列名の変更はできない。
(ただし、Oracle8iから列の削除ができるようになったため、列を削除してから別名で列を作成する)
※RENAME TOコマンドは、表名にスキーマ名をつけることはできない。よって、このコマンドを実行するには、かならずその表の所有者でなければならない。

2.列の変更

■列の定義を変更する

《構文》

ALTER TABLE 表名
 MODIFY ( 列名 列のデータ型 [NOT NULL] [,列名 列のデータ型 [NOT NULL]]);

《変更できるもの》

1.列のサイズ
作成時に指定したデータのサイズを変更する。変更する列に1件でもデータが格納されている場合、「精度(桁数)」「位取り(小数点以下の桁数)」「文字幅」を大きくすることはできるが、小さくすることはできない。
2.NOT NULL制約
NOT NULL制約が定義されていない列に対し、NOT NULL制約を追加できる。ただし、NOT NULL制約をかける列にNULL値があったら、制約を追加することはできない。
また、他の制約はこの構文では変更できない(8章3を参照)。
3.DEFAULT値
DEFAULT値を追加、変更できる。変更後から追加されるデータに対して適応される。

例)、dept表のdname列を長さ20に変更する

ALTER TABLE dept
 MODITY (dname VARCHAR2(20));

例)、dept表のdname列にNOT NULL制約を追加する

ALTER TABLE dept
 MODITY (dname [CONSTRAINT 制約名] NOT NULL);

例)、emp表のsal列にDEFAULT値として0を設定する

ALTER TABLE emp
 MODITY (sal DEFAULT 0);

3.制約の変更

■制約を追加(削除)する

《構文(追加)》

ALTER TABLE 表名
 ADD CONSTRAINT 制約名 制約;

《構文(削除)》

ALTER TABLE 表名
 DROP CONSTRAINT 制約名;

例)、dept表のdname列にUNIQUE整合性制約を追加する

ALTER TABLE dept
 ADD CONSTRAINT unuque_dept_dname UNIQUE(dname);

■制約を無効/有効にする

制約は、追加・削除だけでなく、一時的に無効/有効にすることができる。一度、無効にした制約は、有効にするコマンドを実行するまで無効のままである。
この機能を利用し、制約を一時的に削除し、作り直すという手間が省ける。

《構文(無効にする)》

ALTER TABLE 表名
 DISABLE CONSTRAINT 制約名;

《構文(有効にする)》

ALTER TABLE 表名
 ENABLE CONSTRAINT 制約名;

4.既存表から新しい表を作成

既にある表を元に、別の表を作成することができる。
(Accessのテーブル作成クエリー)

■構文

CREATE TABLE 表名 AS
 SELECT 列名 [,列名 ,・・・] FROM 元表名
 WHERE 条件;

例)、emp表からdeptnoが10であるデータをすべて選択し、emp10テーブルを作成する

CREATE TABLE emp10 AS
 SELECT * FROM emp
 WHERE deptno = 10;

まとめ・補足

■変更のガイドライン

1.列の幅(精度、位取り、文字幅)を小さくする
変更対象となる列のすべての行にNULLのみが含まれているか、または、表にデータが1件も含まれていない場合に可能。
2.データ型の変更
変更対象となる列のすべての行にNULLのみが含まれているか、または、表にデータが1件も含まれていない場合に可能。
ただし、CHARからVARCHAR2もしくはVARCHAR2からCHARへの変更は、NULL値以外が含まれていても、サイズを変更しなければ可能。
3.デフォルト値の変更
常に可能。変更後に挿入されるデータのみが影響を受ける。

■DROP UNUSED COLUMNSオプション

Oracle8iからの機能。表の列に対して未使用マークを付けた列をまとめて削除する。未使用マークの付いた列のうち、一部の列のみを削除することはできない。

■DROP COLUMN

Oracle8iからの機能。列の削除を行う。(Oracle8までは列の削除はできなかったため、表を削除して作り直す、またはCREATE TABLE 〜 AS SELECT 〜で不要の列を除いたテーブルを作成し、前の表を削除後、改名していた)。
ただし、削除対象となる列のすべての行にNULLのみが含まれているか、または、表にデータが1件も含まれていない場合に可能。

練習問題

問題1

NOT NULL制約を追加するコマンドを答えよ。

問題2

ALTER TABLEコマンドでできることの説明のうち、正しいものはどれか答えよ。

  1. ALTER TABLE emp RENAME TO employee;
    このSQL文で、emp表をemployee表に改名できる。
  2. ALTER TABLE emp MODITY (ename VARCHAR2(30));
    このSQL文で、ename列の幅を小さくすることは常に可能。
  3. ALTER TABLE emp ADD (new_col NUMBER);
    このSQLで、新しいnew_col列を追加できる。
  4. ALTER TABLE emp DROP UNUSED COLUMNS;
    このSQLで、未使用マークの付いた列のうち、特定の列だけを削除できる。
  5. ALTER TABLE emp DROP COLUMN ename;
    このSQLで、ename列を削除することはできない。

問題3

下記テーブルに対して、表定義の変更を行う。

EMP表の定義
列名NULL?
EMPNONOT NULLNUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNONOT NULLNUMBER(2)

EMP表のデータ
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
7698BLACKMANAGER78391981-05-012850
30
7782CLEAKMANAGER78391981-06-092450
10
7566JONESMANAGER78391981-04-02

20
7499ALLENSALESMAN76981981-02-201600
30
7521WARDSALESMAN76981981-02-221250
30

以下のSQLを実行した際、エラーになる文はどれか答えよ。また、理由を説明せよ。

  1. ALTER TABLE emp MODITY (sal NUMBER(9));
  2. ALTER TABLE emp MODITY (sal NUMBER(10));
  3. ALTER TABLE emp MODITY (sal NUMBER(8,1));
  4. ALTER TABLE emp MODITY (sal NUMBER(8,2) NOT NULL);
  5. ALTER TABLE emp MODITY (sal NUMBER(8,2) DEFAULT 600 NOT NULL);
  6. ALTER TABLE emp MODITY (comm NUMBER(4));
  7. ALTER TABLE emp MODITY (comm CHAR(6));
  8. ALTER TABLE emp MODITY (project VARCHAR2(30) NOT NULL);
  9. ALTER TABLE emp MODITY (project VARCHAR2(30) DEFAULT 'NONE' NOT NULL);

問題4

制約について、正しくないものを選べ。

  1. ON DELETE CASCADEオプションを設定しても、子表から参照される親表内の行は削除できない。
  2. 制約のON/OFFは切り替えられる。
  3. NOT NULL制約は、ADD CONSTRAINT構文によって、表作成後も設定できる。

[ TOP ]