導入
データベースの設計は常に変化するものです。要件変更に伴い「テーブル名を変更したい」「後から項目を追加したい」というケースは、DBAにとって日常茶飯事でしょう。しかし、これらの操作は一見簡単そうに見えて、思わぬ制約や仕様上の制限が潜んでいます。本稿では、SQLiteにおけるALTER TABLEの基本から、現場でハマりやすい注意点までを解説します。
基礎知識
SQLiteのALTER TABLE文は、既存のデータベースオブジェクトの定義を変更するために使用します。DDL(Data Definition Language)の一種ですが、他のRDBMS(PostgreSQLやMySQLなど)と比較すると、SQLiteのALTER TABLEは非常に限定的な機能しか持っていません。具体的には「テーブル名の変更」と「カラムの追加」のみがサポートされており、既存カラムの変更や削除は直接的には行えない(※バージョンや制約による)という点に注意が必要です。
実装/解決策
テーブル名の変更とカラムの追加は、以下の構文で行います。
テーブル名変更
ALTER TABLE 旧テーブル名 RENAME TO 新テーブル名;
カラム追加
ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型;
カラム追加の際、SQLiteでは「テーブルの末尾」に新しい列が物理的に追加されます。この際、既存のデータにはデフォルト値(指定がない場合はNULL)が自動的に適用されます。
サンプルプログラム
以下は、SQLiteのコマンドラインツールで実行可能な一連の操作例です。
— 1. テーブル名の変更
— 現在ある ‘users_temp’ を ‘users’ に変更する
ALTER TABLE users_temp RENAME TO users;
— 2. カラムの追加
— ‘users’ テーブルに年齢(age)カラムを追加する
— データ型は INTEGER を指定
ALTER TABLE users ADD COLUMN age INTEGER;
— 3. デフォルト値を指定したカラムの追加
— ‘email’ カラムを追加し、初期値を ‘none@example.com’ に設定する
— NOT NULL 制約を付ける場合は、このようにデフォルト値の指定が必須となる
ALTER TABLE users ADD COLUMN email TEXT DEFAULT ‘none@example.com’;
— 4. 実行後の確認
— スキーマを表示して変更が正しく反映されたか確認する
.schema users
応用・注意点
現場で最も注意すべき点は、「カラムの削除・変更ができない」という制約です。SQLiteではALTER TABLEで列を消すことができません。誤って追加してしまった場合や、型を変更したい場合は、以下の手順を踏むのが定石です。
1. 新しい構造のテーブルをCREATE TABLEで作成する
2. INSERT INTO … SELECT … で古いテーブルからデータを移す
3. 古いテーブルをDROP TABLEで削除する
4. 必要に応じて新しいテーブルをRENAMEで元の名前に戻す
また、「NOT NULL制約」を後付けする際も注意が必要です。既存データにはNULLが入っている可能性があるため、必ずデフォルト値を指定するか、先にデータを更新してから追加するようにしてください。これらの制約を理解し、運用の際には「一度作成したテーブルの再設計はコストがかかる」ことを前提に、余裕を持った設計を心がけましょう。

コメント