【SQLite入門】テーブルから列を削除する

SQLiteでは残念ながら、ALTER TABLE での列の削除はサポートされていません。

以下では、列を削除する方法について記載しています。

1. 削除手順の概要

テーブルから直接列を削除することは出来ないため、大まかに次の手順で列の削除を行います。

  1. 列を削除した新しいテーブルを作成
  2. 旧テーブルから新しいテーブルにデータを移行
  3. 旧テーブルを削除
  4. 新しいテーブルをリネーム

2. 削除手順の詳細

1. トリガーやビューの定義を確認

旧テーブルを削除すると、テーブルを参照しているトリガーは削除されます。

また、ビューも手順の過程で削除するので、念のためテーブルを参照しているトリガーやビューを把握し、定義内容を退避します。

次のSQLで旧テーブルに関連するトリガーやビューの定義を確認することが出来ます。

2. 外部キー制約を無効にする

外部キー制約を有効にして運用している場合、外部キー制約を無効にします。

3. 列を削除した新しいテーブルを定義

旧テーブルデータを移行するために、列を削除した新しいテーブルを定義します。

4. 旧テーブルから新しいテーブルにデータ移行

次のSQLなどを使用して旧テーブルのデータを移行します。

5. ビューの削除

旧テーブルを参照しているビューを削除します。

6. 旧テーブルの削除

旧テーブルを削除します。

7. 新しいテーブル名の変更

新しいテーブル名を旧テーブル名に変更します。

8. ビューの再作成

手順5で削除したビューを再作成します。

もし、削除した列を参照している場合は、ビューの内容を書き換えて再作成します。

9. トリガーの再作成

旧テーブルを参照していた、トリガーを再作成します。

10. 外部キー制約のチェック

外部キー制約に不整合が生じていないかチェックします。

不整合が生じている場合は、どの制約で不整合が起きているか表示されるので適宜対応します。

11. 外部キー制約を有効にする

外部キー制約に不整合が生じていないことを確認したら外部キー制約を有効にします。

3. 実行例

テスト用のテーブルを作成して、実際に列の削除を行います。

以下の実行例では3テーブル、1ビューを使用します。

テーブル

3つのテーブル(tbl_a、tbl_b、tbl_c)を使用します。
全体では tbl_a → tbl_b → tbl_c という関係になります。
※ → は 1:多

定義

ビュー

tbl_a と tbl_b を結合した内容を表示する単純なビューです。

定義

トリガー

tbl_b の トリガーを作成します。
tbl_b に データを追加すると、tbl_a の b_cnt列を更新するトリガーです。

定義

テスト用データ

各テーブルに1つずつデータを登録します。

列名の変更

ここからは、上記で定義した tbl_bテーブルt2列 の削除を行います。

1. トリガーやビューの定義を確認

定義内容に”tbl_b”を含むSQLの一覧を表示して、ビューやトリガーの定義を確認します。

2. 外部キー制約を無効にする

外部キー制約を無効にします。

3. 列を削除した新しいテーブルを定義

t2列を削除した、tbl_b_new テーブルを定義します。

4. 旧テーブルから新しいテーブルにデータ移行

tbl_b テーブルのデータを、次のSQLで tbl_b_new に移行します。

5. ビューの削除

v_ab ビューを削除します。

6. 旧テーブルの削除

tbl_b テーブルを削除します。

7. 新しいテーブル名の変更

tbl_b_new テーブル名 を tbl_b に変更します。

8. ビューの再作成

v_ab ビューを再作成します。
※ SQLは最初に定義した v_ab と同じです。

9. トリガーの再作成

trg_increment_b_cnt トリガーを再作成します。
※ SQLは最初に定義した trg_increment_b_cnt と同じです。

10. 外部キー制約のチェック

11. 外部キー制約を有効にする

これで列の削除ができました。

4. まとめ

SQLiteで列の削除を行いました。

ALTER TABLE で列を削除できないため、列を削除するには手間がかかります。

不要になった列でも運用に支障がない場合は、列を削除せずそのまま残しておくのもありかと思います。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする