~その理解、本当に正しいですか?~
Oracle Database(以下、オラクル)は高性能・高信頼な商用RDBMSとして、企業を中心に広く利用されています。しかしその反面、仕様や操作に関して誤った認識を持ったまま運用されているケースも少なくありません。
本記事では、特に初心者や他RDBMS経験者が陥りやすい 3つの誤解 を取り上げて、正しい理解と違いを丁寧に解説します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
誤認識①:DELETEとTRUNCATEは同じ
🔍 よくある勘違い:
「どちらもデータを削除するんだから同じでしょ?」という認識は非常に多いですが、トランザクションの扱いやログの生成、処理速度などの面で大きな違いがあります。
✅ 正しい理解:
| 項目 | DELETE | TRUNCATE |
|---|---|---|
| WHERE句 | 使用可能 | 使用不可(全件削除) |
| トランザクション制御 | ROLLBACK可能 | ROLLBACK不可(即時反映) |
| REDO/UNDO生成 | 多い | 少ない |
| トリガー発動 | 発動する | 発動しない |
| 高速性 | 比較的遅い | 高速 |
📌 例:
-- 特定の条件のレコードを削除
DELETE FROM employees WHERE department_id = 10;
-- テーブルの全レコードを一括削除(高速)
TRUNCATE TABLE employees;
💡 補足:
TRUNCATEは一見便利に見えますが、UNDOが最小限のため、誤って実行すると取り返しがつかないことも。重要テーブルに対しては注意が必要です。
誤認識②:UNIQUE制約とPRIMARY KEYは同じ
🔍 よくある勘違い:
「どっちも重複禁止の制約なんだから、意味は一緒でしょ?」という認識です。
✅ 正しい理解:
どちらも重複を防ぐという点では似ていますが、NULLの扱いやテーブル内での使用数制限が異なります。
| 比較項目 | PRIMARY KEY | UNIQUE |
|---|---|---|
| NULLの扱い | 不可(NOT NULL強制) | 可(NULL複数可) |
| 複数設定 | テーブルに1つのみ | 複数可 |
| インデックス | 自動で一意インデックス作成 | 同様に作成される |
📌 例:
-- PRIMARY KEY:NULL不可、1つだけ
CREATE TABLE emp1 (
emp_id NUMBER PRIMARY KEY,
name VARCHAR2(100)
);
-- UNIQUE:NULL可、複数指定可能
CREATE TABLE emp2 (
emp_id NUMBER,
email VARCHAR2(100),
CONSTRAINT emp2_email_uk UNIQUE (email)
);
💡 補足:
NULLが含まれる可能性がある列に一意制約を設けたい場合は、UNIQUE制約を使いましょう。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
誤認識③:テーブル削除後でもUNDOで元に戻せる
🔍 よくある勘違い:
UNDOという仕組みがあるから、「テーブルをDROPしても戻せる」と思ってしまう方もいます。
✅ 正しい理解:
UNDOはトランザクションのロールバックや一貫性維持のために存在し、DROPやTRUNCATEのようなDDL(データ定義言語)の操作には無関係です。
-- テーブルを削除(UNDOでは戻せない)
DROP TABLE employees;
✅ 正しく戻すには:
オラクルには「フラッシュバック・ドロップ」という仕組みがあります。これにより、削除されたテーブルをリサイクルビンから復元可能です(PURGEされていない場合に限る)。
FLASHBACK TABLE employees TO BEFORE DROP;
💡 補足:
フラッシュバック・ドロップ機能は、特に開発・検証環境で非常に便利です。ただし、すべての操作に有効というわけではないため注意が必要です。
まとめ
| 誤認識 | 実際の理解 |
|---|---|
| DELETEとTRUNCATEは同じ | トランザクション、ログ、トリガーの動作が異なる |
| UNIQUEとPRIMARY KEYは同じ | NULLの扱いや制限数が違う |
| テーブルはUNDOで戻せる | 実際はフラッシュバック機能が必要 |
[参考]
16 UNDOの管理




コメント