2.

Oracle表関連DDL|CREATE・ALTER・DROP・TRUNCATEの基本

編集
この記事の要点
  • 表(テーブル)関連 DDL は CREATE / ALTER / DROP / TRUNCATE / RENAME / COMMENT が主役
  • CREATE TABLE で新規作成。列定義 + 制約(NOT NULL / PRIMARY KEY / FOREIGN KEY / CHECK)を一括指定
  • ALTER TABLE で列追加・変更・削除、制約の追加・削除を行う
  • DROP TABLE は表ごと消す。TRUNCATE TABLE はデータだけ高速削除(暗黙コミット)
  • DDL は自動コミットされる — ロールバック不可。本番では事前検証必須

表関連 DDL とは

Oracle の表(テーブル)に対する DDLは、テーブル構造の作成・変更・削除を行う SQL 文の総称です。データを操作する DML(SELECT / INSERT / UPDATE / DELETE)と異なり、スキーマ自体を変えるのが特徴です。

目的
CREATE TABLE新しい表を作成
ALTER TABLE列定義の追加・変更・削除、制約の追加・削除、表名や列名の変更
DROP TABLE表ごと完全に削除
TRUNCATE TABLE表の構造は残してデータだけ高速削除
RENAME表名を変更
COMMENT表や列にコメントを付ける(DBA 向けメモ)

CREATE TABLE

新しい表を作成します。列定義と制約を一括で書きます。

CREATE TABLE employees (
  emp_id     NUMBER(10)    PRIMARY KEY,
  name       VARCHAR2(100) NOT NULL,
  email      VARCHAR2(255) UNIQUE,
  dept_id    NUMBER(10)    REFERENCES departments(dept_id),
  salary     NUMBER(10,2)  CHECK (salary >= 0),
  hired_at   DATE          DEFAULT SYSDATE,
  created_at TIMESTAMP     DEFAULT SYSTIMESTAMP
);

主な制約は次の通りです。

制約意味
NOT NULLNULL を禁止
PRIMARY KEY主キー(NOT NULL + UNIQUE)
UNIQUE重複禁止
FOREIGN KEY / REFERENCES他表の列を参照(外部キー)
CHECK列値が条件を満たすか検査
DEFAULTINSERT 時の既定値

ALTER TABLE

列の追加

ALTER TABLE employees ADD (
  phone     VARCHAR2(20),
  is_active NUMBER(1) DEFAULT 1
);

列定義の変更

-- 桁数を広げる、NULL 許可を変える
ALTER TABLE employees MODIFY (
  email VARCHAR2(320),
  phone VARCHAR2(20) NOT NULL
);

列の削除

ALTER TABLE employees DROP COLUMN phone;

列名 / 表名の変更

ALTER TABLE employees RENAME COLUMN name TO full_name;
ALTER TABLE employees RENAME TO staff;
-- 単独構文の RENAME も使える
RENAME staff TO employees;

制約の追加・削除

ALTER TABLE employees
  ADD CONSTRAINT chk_salary CHECK (salary >= 0);

ALTER TABLE employees
  DROP CONSTRAINT chk_salary;

DROP TABLE

表を完全に削除します。データもインデックスも一緒に消えます。Oracle 10g 以降はごみ箱(RECYCLEBIN)に入るので、FLASHBACK TABLE ... TO BEFORE DROP で復活可能です。永久削除したいときは PURGE を付けます。

DROP TABLE employees;            -- ごみ箱に入る
DROP TABLE employees PURGE;      -- 永久削除(戻せない)
DROP TABLE employees CASCADE CONSTRAINTS;  -- 参照制約も道連れで削除

TRUNCATE TABLE

表は残してデータだけを高速に全削除します。DELETE と違って次の特徴があります。

項目DELETETRUNCATE
区分DMLDDL
トランザクションロールバック可暗黙コミット、ロールバック不可
速度レコード数に比例非常に高速(HWM のリセット)
WHERE使える使えない(全消し)
トリガ起動されるされない
領域返却されない(再利用される)される(オプションで保持も可)
TRUNCATE TABLE employees;                 -- 領域を返却
TRUNCATE TABLE employees REUSE STORAGE;   -- 領域は確保したまま

DDL とトランザクション

Oracle の DDL は暗黙コミットされます。たとえば INSERT を流したあと CREATE TABLE を実行すると、まだ COMMIT していない INSERT も含めてすべて確定されてしまいます。本番運用では次が鉄則です。

  • DDL の前に既存トランザクションを必ず明示的に COMMIT or ROLLBACK
  • 本番への DDL は検証環境で構文を確認してから流す
  • 戻せない(DROP / TRUNCATE)操作は事前にエクスポートを取る

FLASHBACK でうっかり削除を復旧

Oracle 10g 以降のごみ箱機能を使えば、DROP TABLE 直後でも復元できます。PURGE 付きで消した場合や、表領域ごと消した場合は復元できません。

-- ごみ箱の中身を確認
SELECT object_name, original_name, droptime FROM user_recyclebin;

-- 復元
FLASHBACK TABLE employees TO BEFORE DROP;

-- 名前を変えて復元(同名表が既に存在する場合)
FLASHBACK TABLE employees TO BEFORE DROP RENAME TO employees_old;

-- ごみ箱を空にする
PURGE RECYCLEBIN;

関連

編集
Post Share
子ページ
  1. 表の作成
  2. カラムの追加
  3. カラムの定義変更
  4. カラムの削除
  5. 表の削除
同階層のページ
  1. ユーザー関連
  2. 表関連
  3. 索引関連

最近更新/作成されたページ