◀ 2.

Oracle 19cの表DDL|表操作の選び方とCREATE・ALTER・DROP・TRUNCATE

▶

目的から項目を選ぶ

Oracle 19cの表・索引DDLを目的別に選ぶための案内です。以下から詳細ページを選んでください。各ページの製品・版・前提条件も確認し、そのまま本番へ一括実行する手順とは扱わないでください。

  1. 表の作成:新しい表を作る
  2. カラムの追加:列を追加する
  3. カラムの定義変更:既存列の定義を変更する
  4. カラムの削除:列を削除する
  5. 表の削除:表そのものを削除する
  6. TRUNCATE文:表を残して全行を削除する(製品別の比較)

親カテゴリ:DDL。DDLや採番を消費するSELECTは読取だけの確認ではありません。以下は独立した教材例であり、実DBでの実行・性能・復旧成功を保証しません。

Oracle 19cの表操作を作成・列追加・定義変更・列削除・表削除・全行削除の対象別に選ぶ図
表・列の定義変更と全行削除を区別する模式図です。通常表DDLの暗黙COMMITと一時表等の例外、依存関係・復旧条件は本文で確認してください。
この記事の要点
  • 表(テーブル)関連 DDL は CREATE / ALTER / DROP / TRUNCATE / RENAME / COMMENT が主役
  • CREATE TABLE で新規作成。列定義 + 制約(NOT NULL / PRIMARY KEY / FOREIGN KEY / CHECK)を一括指定
  • ALTER TABLE で列追加・変更・削除、制約の追加・削除を行う
  • DROP TABLE は表ごと消す。TRUNCATE TABLE は表を残して全行を削除(通常表は暗黙COMMIT、速度は条件次第)
  • Oracleの通常表DDLは暗黙COMMITを伴い、通常のROLLBACKでは戻せません。private temporary tableの例外とは区別します

表関連 DDL とは

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

文目的
CREATE TABLE新しい表を作成
ALTER TABLE列定義の追加・変更・削除、制約の追加・削除、表名や列名の変更
DROP TABLE表の定義・データを削除(復旧可否は別途条件付き)
TRUNCATE TABLE表の構造は残して全行を削除(速度は依存・ロック待機・負荷次第)
RENAME表名を変更
COMMENT表や列にコメントを付ける(DBA 向けメモ)

CREATE TABLE

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

Oracle 19cの独立した作成例です。departments(dept_id)の参照可能な主キー/一意制約が必要です。同名表がある状態や他の例と連続して実行しないでください。

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 NULL・PRIMARY KEY・UNIQUE・FOREIGN KEY・CHECKは整合性の制約です。DEFAULTはOracleの制約ではなく、値を省略した場合等に使う列の既定値指定です。

制約・既定値意味
NOT NULLNULL を禁止
PRIMARY KEY主キー(NOT NULL + UNIQUE)
UNIQUE重複禁止
FOREIGN KEY / REFERENCES他表の列を参照(外部キー)
CHECK列値が条件を満たすか検査
DEFAULT列の既定値指定(制約ではない)。INSERTで値を省略した場合等に使う。通常のDEFAULTは明示NULLを置換せず、DEFAULT ON NULLとは区別する

ALTER TABLE

列の追加

Oracle 19cの列追加例です。既存の列名・既定値・利用側を確認し、検証用の表で個別に評価してください。

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

列定義の変更

Oracle 19cの定義変更例です。phoneの既存NULLや全属性、利用側を照合してください。NOT NULL追加の成功を保証する例ではありません。

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

列の削除

Oracle 19cの列削除例です。phoneの値は失われ、通常のROLLBACKや同名列の再追加では復元できません。

ALTER TABLE employees DROP COLUMN phone;

列名 / 表名の変更

Oracle 19cの名前変更例です。参照するSQL・アプリへの互換を保証しません。他の例の表名とは独立して読んでください。

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

制約の追加・削除

Oracle 19cの制約追加/削除例です。既存データの適合と同名制約の有無を確認してください。既存制約の解除をエラーの自動対処にしないでください。

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

ALTER TABLE employees
  DROP CONSTRAINT chk_salary;

DROP TABLE

表の定義・データと索引等を削除します。Oracle 19cでは対象表と設定がrecycle binの条件を満たし、対象がまだ残る場合に限り、FLASHBACK TABLE ... TO BEFORE DROPを検討できます。DROPしたことと復旧できることは別です。PURGE付きはFlashback Dropできず、バックアップ等の復旧可否まで一律には断定できません。

保存したOracle 19cのDROP比較例です。「ごみ箱に入る」は対象・設定・領域条件付きです。PURGEはFlashback Drop不可、CASCADE CONSTRAINTSは参照制約を削除します。3文を連続実行しないでください。

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

TRUNCATE TABLE

表は残して全行を削除します。行単位のDELETEより効率的な場合がありますが、依存関係・ロック待機・負荷によって実行時間は変わり、高速とは限りません。Oracle 19cの通常表ではDELETEと次の違いがあります。

項目DELETETRUNCATE
区分DMLDDL
トランザクションロールバック可Oracle通常表は暗黙COMMIT、ROLLBACK不可。private temporary tableの既存transactionへのCOMMIT例外は別
速度対象行数・アクセスパス・索引保守・トリガ・ロック待機等に依存し、単純比例とは限らないHWMリセット等で有利な場合があるが、依存・ロック待機・負荷次第
WHERE使える使えない(全消し)
トリガ起動定義に応じDELETEのDMLトリガDELETEの行DMLトリガは発火しない。SCHEMA/DATABASEのTRUNCATE DDLトリガは別
領域返却されない(再利用される)される(オプションで保持も可)

Oracle 19cの通常表を空にする代替例です。DELETEの行DMLトリガは発火せず、DDLトリガとは別です。TRUNCATEは通常のROLLBACKで戻せません。2文の連続実行を勧めません。

TRUNCATE TABLE employees;                 -- 領域を返却
TRUNCATE TABLE employees REUSE STORAGE;   -- 領域は確保したまま

採番も別に確認します。Oracleの独立したSEQUENCEは表と独立したオブジェクトであり、表のTRUNCATEによるリセット対象とは扱いません。GENERATED AS IDENTITYのTRUNCATE後の値はこの説明では未確認であり、独立SEQUENCEから継続/リセットを類推しません。

DDL とトランザクション

Oracle 19cの通常のDDLでは、構文上正しいDDLの実行前と、成功したDDLの実行後に暗黙COMMITがあります。先行する未確定INSERTも確定するため、DDLが失敗すれば先行DMLも戻るとは保証できません。ただしprivate temporary tableのTRUNCATEは既存transactionをCOMMITしない例外です。これは通常表TRUNCATEの取消可能性を意味しません。本番運用では次を確認します。

  • DDLの前に対象transactionと未確定変更を確認し、業務上その変更を確定するか取消すかを判断して、必要なCOMMITまたはROLLBACKを行う。DDLを通すための無闇なCOMMITはしない
  • 本番への DDL は検証環境で構文を確認してから流す
  • 通常のROLLBACKで戻せないDROP / TRUNCATEの前に、必要なデータ・定義・依存の退避と復元手順を確認する。エクスポートの取得だけでは復元を保証しない。対象範囲・整合性・権限と、隔離環境での復元確認まで含めて判断する

FLASHBACK でうっかり削除を復旧

Oracle 19cのFlashback Dropは、対応する表がrecycle binに残っており、対象・権限・名前等の条件を満たす場合の復旧です。直後でも成功を保証しません。PURGE済みや表領域ごと削除された対象はこの方法では戻せません。TRUNCATEした行の復旧手段とも異なります。

保存したOracleの復旧構文比較です。TO BEFORE DROPはrecycle binに対象が残る等の条件付きです。末尾のPURGE RECYCLEBINは読取ではなく復旧候補を消す操作なので実行しないでください。

-- ごみ箱の中身を確認
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;

関連

公式資料と確認範囲

Oracle Database 19c、MySQL 8.4、PostgreSQL 18とMicrosoft SQL Serverの一次資料で構文と条件を照合しています。導入版の根拠はPostgreSQL 12のリリースノートです。SQLや実ブラウザでの検証結果ではなく、他版・エディションや省略された検体の成功を保証しません。

補足の根拠:Oracle 19c CREATE TABLEのDEFAULT、索引・関数索引とBITMAPのロック、ALTER INDEXのTABLESPACE省略、ANALYZE、統計収集、costによるアクセスパス選択、MySQL 8.4の型変換、PostgreSQL 18の部分索引、SQL Server UNIQUEとNULL、SQL Server DROP INDEXの対象指定。

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

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