[SQLのはじめ方] Part19: ALTER TABLEとDROP TABLE

SQL

こんにちは!SQL学習のステップ5へようこそ。ここでは、すでに作成したテーブルの構造を変更したり、不要になったテーブルを削除したりする方法を学びます。データベースを運用していく上で、これらの操作は必ず必要になります。しっかりマスターしましょう!💪

このセクションでは、データ定義言語(DDL)の中でも特に重要なALTER TABLE文とDROP TABLE文について解説します。

1. テーブル定義の変更:ALTER TABLE文

ALTER TABLE文は、既存のテーブルの定義(構造)を変更するためのSQLコマンドです。カラムの追加、削除、データ型の変更、テーブル名の変更など、様々な操作が可能です。データベースの設計変更や機能追加に伴ってよく使われます。

主なALTER TABLEの操作

1.1 カラムの追加 (ADD COLUMN)

テーブルに新しいカラムを追加します。ADD COLUMN句を使用します。


-- usersテーブルに 'last_login_at' カラム (TIMESTAMP型) を追加する
ALTER TABLE users
ADD COLUMN last_login_at TIMESTAMP;

-- productsテーブルに 'stock' カラム (INTEGER型、デフォルト値0) を追加する
ALTER TABLE products
ADD COLUMN stock INTEGER DEFAULT 0;
      

データ型やデフォルト値、NOT NULL制約なども同時に指定できます。

1.2 カラムの削除 (DROP COLUMN)

テーブルから既存のカラムを削除します。DROP COLUMN句を使用します。

⚠️ 注意: カラムを削除すると、そのカラムに格納されていたデータもすべて失われます。元に戻すことは難しいため、実行前に必ず確認してください。

-- usersテーブルから 'old_address' カラムを削除する
ALTER TABLE users
DROP COLUMN old_address;
      

1.3 カラムのデータ型や制約の変更 (ALTER COLUMN / MODIFY COLUMN)

既存のカラムのデータ型や制約(NOT NULLなど)を変更します。この構文は、使用しているデータベース管理システム(RDBMS)によって異なる場合があります。


-- PostgreSQL: usersテーブルの 'email' カラムのデータ型をVARCHAR(255)に変更
ALTER TABLE users
ALTER COLUMN email TYPE VARCHAR(255);

-- MySQL: usersテーブルの 'email' カラムのデータ型をVARCHAR(255)に変更
ALTER TABLE users
MODIFY COLUMN email VARCHAR(255);

-- PostgreSQL: usersテーブルの 'phone_number' カラムにNOT NULL制約を追加
ALTER TABLE users
ALTER COLUMN phone_number SET NOT NULL;

-- MySQL: usersテーブルの 'phone_number' カラムにNOT NULL制約を追加(データ型も再指定が必要な場合あり)
ALTER TABLE users
MODIFY COLUMN phone_number VARCHAR(20) NOT NULL;
      

データ型の変更は、既存のデータと互換性がない場合、エラーになったりデータが失われたりする可能性があるため注意が必要です。

1.4 カラム名の変更 (RENAME COLUMN)

既存のカラム名を変更します。これもRDBMSによって構文が異なります。


-- PostgreSQL, MySQL (比較的新しいバージョン): usersテーブルの 'user_name' カラムを 'username' に変更
ALTER TABLE users
RENAME COLUMN user_name TO username;

-- 古いMySQLなど: usersテーブルの 'user_name' カラムを 'username' に変更(データ型も再指定が必要)
ALTER TABLE users
CHANGE COLUMN user_name username VARCHAR(50); -- データ型は元の型に合わせる
      

1.5 テーブル名の変更 (RENAME TO)

テーブル自体の名前を変更します。


-- 'customers' テーブルを 'clients' に変更する
ALTER TABLE customers
RENAME TO clients;
      

ALTER TABLEの注意点 ⚠️

  • データ量と実行時間: テーブルに大量のデータが存在する場合、ALTER TABLEの実行には時間がかかることがあります。実行中はテーブルがロックされ、他の操作ができなくなる可能性もあります。
  • 元に戻せない操作: カラム削除(DROP COLUMN)など、一部の操作は元に戻すことが困難です。
  • RDBMSによる構文の違い: 上記の例のように、使用するデータベース製品(MySQL, PostgreSQL, SQLiteなど)によって構文が異なる場合があります。必ず利用しているデータベースのマニュアルを確認しましょう。
  • 依存関係: 変更しようとしているカラムが他のオブジェクト(ビュー、インデックス、外部キー制約など)から参照されている場合、エラーが発生したり、意図しない影響が出たりすることがあります。

2. テーブルの削除:DROP TABLE文

DROP TABLE文は、テーブルをデータベースから完全に削除するためのSQLコマンドです。テーブル定義(構造)とそのテーブルに含まれるすべてのデータが削除されます。


-- 'temporary_data' という名前のテーブルを削除する
DROP TABLE temporary_data;
    

🚨 最重要注意点:DROP TABLEは非常に危険な操作です!

DROP TABLEを実行すると、テーブルとその中のすべてのデータが完全に失われます。通常、簡単な操作で元に戻すことはできません。誤って重要なテーブルを削除しないように、細心の注意を払ってください。
  • ✅ 実行する前に、対象のテーブル名が正しいか何度も確認しましょう。
  • ✅ 可能であれば、実行前に必ずデータベースのバックアップを取得しましょう。
  • ✅ 本番環境での実行は特に慎重に行い、事前にテスト環境で試しましょう。

DROP TABLEのオプション

2.1 IF EXISTS

削除しようとしたテーブルが存在しない場合にエラーが発生するのを防ぎたい場合は、IF EXISTSオプションを使用します。テーブルが存在すれば削除し、存在しなければ何もせずに正常終了します。スクリプトなどで利用すると便利です。


-- もし 'old_logs' テーブルが存在すれば削除する(存在しなくてもエラーにならない)
DROP TABLE IF EXISTS old_logs;
    

2.2 CASCADE (取り扱い注意!)

削除しようとしているテーブルが、他のテーブルから外部キー制約などで参照されている場合、通常はエラーとなり削除できません。CASCADEオプションを指定すると、そのテーブルを参照している制約なども一緒に削除します。

⚠️ 注意: CASCADEオプションは、意図しない制約やオブジェクトまで削除してしまう可能性があるため、影響範囲を十分に理解した上で、慎重に使用する必要があります。基本的には、依存関係を先に手動で解除してからDROP TABLEを実行する方が安全です。

-- ordersテーブルを削除し、このテーブルを参照している外部キー制約なども一緒に削除する (非推奨な場合が多い)
-- DROP TABLE orders CASCADE; -- 実行には十分な注意が必要!
    

まとめ

今回は、テーブルの構造を変更するALTER TABLE文と、テーブルを削除するDROP TABLE文について学びました。

コマンド主な用途注意点
ALTER TABLEカラムの追加・削除・変更、テーブル名の変更など、テーブル定義の変更データ量による実行時間、元に戻せない操作、RDBMSによる構文差、依存関係
DROP TABLEテーブルとその全データの完全な削除非常に危険! データ消失、復元困難、バックアップ推奨、IF EXISTS, CASCADE (注意)

特にDROP TABLEは非常に強力なコマンドなので、使う際には十分すぎるほど注意してくださいね。⚠️

これでStep 5は完了です!お疲れ様でした。😊 次のStep 6では、データベースのパフォーマンスに大きく関わる「インデックス」について学んでいきましょう!

コメント

タイトルとURLをコピーしました