【SQL実践|実務向け】SQLite運用における「ALTER TABLE」の正しい使い方と落とし穴

導入

データベースの設計は常に変化するものです。要件変更に伴い「テーブル名を変更したい」「後から項目を追加したい」というケースは、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が入っている可能性があるため、必ずデフォルト値を指定するか、先にデータを更新してから追加するようにしてください。これらの制約を理解し、運用の際には「一度作成したテーブルの再設計はコストがかかる」ことを前提に、余裕を持った設計を心がけましょう。

コメント

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